PTA_数据结构与算法_7-51 两个有序链表序列的合并 (20分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。输入格式:输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。输出格式:在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。输入样例:1 3 5 -12 4 6 8 10 -1输出样...
·
已知两个非降序链表序列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
代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node{
int Data;
struct Node *Next;
} *List;
List Read();//读入链表
int main()
{
List L1, L2, L3, LL3;//L1,L2为两个输入序列,L3为输出序列头结点,LL3为合并序列的循环变量
L1 = Read();
L2 = Read();
L3 = (List)malloc(sizeof(List));//初始化
L3->Next = NULL;
L3->Data = -1;
LL3 = L3;
L1 = L1->Next;//头结点数据为-1,应从下一个结点开始合并
L2 = L2->Next;
while(L1 && L2){//L1,L2均不为空
if(L1->Data < L2->Data){//比较大小
LL3->Next = L1;//L1当前结点数据较小则L1插入LL3
L1 = L1->Next;//L1当前结点后移
}else{//否则对L2进行操作
LL3->Next = L2;
L2 = L2->Next;
}
LL3 = LL3->Next;//LL3当前结点后移
}
while(L1){//若L2已空L1不空,把L1结点顺次插入LL3
LL3->Next = L1;
L1 = L1->Next;
LL3 = LL3->Next;
}
while(L2){//否则对L2进行操作
LL3->Next = L2;
L2 = L2->Next;
LL3 = LL3->Next;
}
int flag = 0;//判断是否已有数据输出
L3 = L3->Next;//跳过头结点
if(!L3) printf("NULL\n");//若之后有节点
while(L3){//当L3不空时
if(flag) printf(" ");//若之前已有元素输出则输出空格
printf("%d",L3->Data);//输出L3当前数据
flag = 1;//已有数据输出,把flag置1
L3 = L3->Next;//当前结点后移
}
return 0;
}
List Read(){
List L, tmp, LL;//L为用来返回的头结点,tmp为暂存当前数据的节点,LL为循环变量
int Data;//暂存数据
L = (List)malloc(sizeof(List));//分配空间,头结点初始化
L->Next = NULL;
L->Data = -1;
LL = L;
scanf("%d",&Data);//先读入第一个数据,若为-1则不必进行后续循环
while(Data!=-1){
tmp = (List)malloc(sizeof(List));//tmp分配空间
tmp->Data = Data;//tmp数据为当前读入的数据
tmp->Next = NULL;//tmp相当于链表最后一个结点,Next为空
LL->Next = tmp;//tmp插入表尾
LL = LL->Next;//当前结点后移
scanf("%d",&Data);//读入下一个数据
}
return L;//返回头结点
}

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)