已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
注意事项:
- 注意链表创建时是采用的头插法还是尾插法?
- 是否要进行销毁? 不需要,只需要对Lb所在的结点进行释放即可(并不需要从头到尾销毁)
此处,区分链表顺序表的销毁操作
题解:
/*
自顶向下
- 思路:- 创建LA与LB 定义一个临时变量num,如果输入元素不为-1,就继续创建节点
- 注意:
- 形式变量不开辟节点只是定义临时变量,只在函数调用期间有效
- 最后对两个表进行销毁操作
- 函数调用方式
- 异常处理{ 返回 -1}
- OVERFLOW 不可用
- 注意空间释放之后指针指向,避免出现野指针
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status ListCreate_L(LinkList &L);
Status ListMerge(LinkList &La, LinkList &Lb, LinkList &Lc);
void LinkPrint(LinkList L);
int main()
{
LinkList La, Lb, Lc;
if (ListCreate_L(La) != OK) {
printf("链表La创建失败!\n");
return -1;
}
if (ListCreate_L(Lb) != OK) {
printf("链表Lb创建失败!\n");
return -1;
}
if (ListMerge(La, Lb, Lc) != OK) {
printf("链表合并失败!\n");
return -1;
}
LinkPrint(Lc);
system("pause");
return 0;
}
Status ListCreate_L(LinkList &L) {
L = (LNode*)malloc(sizeof(LNode));
LNode* p = L;
L->next = NULL;
int num = 0;
scanf("%d", &num);
while (num != -1) {
LNode * q = (LNode*)malloc(sizeof(LNode));
q->data = num;
p->next = q;
p=q;
q->next = NULL;
scanf("%d", &num);
}
return OK;
}
Status ListMerge(LinkList &La, LinkList &Lb, LinkList &Lc) {
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
Lc = pc = La;
while (pa && pb) {
if (pa->data <= pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
}
else {
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
free(Lb);
return OK;
}
void LinkPrint(LinkList L) {
LNode* p = L->next;
for (; p&&p->next; p = p->next) {
printf("%d ", p->data);
}
if (p) {
printf("%d", p->data);
}
else {
printf("NULL");
}
}