1.2 编写程序,在第1题(第1题:编写程序,建立2个带头结点单链表,输入若干整数将正整数插入第1个单链表,将负整数插入第2个单链表,插入前和插入后单链表保持递增或相等次序,显示2个单链表,最后销毁。程序不可存在内存泄漏。)基础上合并2个单链表,合并前后单链表保持递增或相等次序,显示合并前后单链表。注意不可存在内存泄漏。。
输入格式:
若干整数。
输出格式:
每个单链表输出占一行,元素间用分隔符分隔;共3行
输入样例:
100 2 3 -2 -8 -6 -9 -10 50 2 -1
输出样例:
2->2->3->50->100
-10->-9->-8->-6->-2->-1
-10->-9->-8->-6->-2->-1->2->2->3->50->100
代码:
#include <stdio.h> //7-13 程序设计综合实践 1.2 (20 分)
#include <stdlib.h>
typedef struct LNode *List;
struct LNode {
int data;
struct LNode *next;
};
void traversal_list(List l) {
List p = l->next;
while (p) {
if (p != l->next) printf("->");
printf("%d", p->data);
p = p->next;
}
printf("\n");
}
void destroy_list(List l) {
while (l) {
List p = l;
l = l->next;
free(p);
}
l = NULL;
}
int main() {
List Lz = (List)malloc(sizeof(struct LNode)); // 正数
Lz->data = 0, Lz->next = NULL;
List Lf = (List)malloc(sizeof(struct LNode)); // 负数
Lf->data = 0, Lf->next = NULL;
List p; // 用于遍历
int a;
do {
scanf("%d", &a);
p = a > 0 ? Lz : Lf;
// 找到插入位置(p结点后面)
while (p->next) {
if (a <= p->next->data) break;
p = p->next;
}
// 插入位置是在p结点后面
List l = (List)malloc(sizeof(struct LNode));
l->data = a;
l->next = p->next;
p->next = l;
} while (getchar() == ' ');
traversal_list(Lz);
traversal_list(Lf);
// 合并链表
List L = Lf;
p = L;
while (p->next) p = p->next; // 最终p为L链表最后一个结点
p->next = Lz->next, Lz->next = NULL;
destroy_list(Lz);
traversal_list(L);
destroy_list(L);
system("pause");
return 0;
}