7-1 两个有序链表序列的合并 (20分)
已知两个非降序链表序列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>
typedef struct Node*List;
//创建结点结构体
struct Node
{
int data;//数据域
struct Node *Next;/指针域
};
//初始化函数:创建一个头结点
//数据域不放数据,指针域赋值为NULL
List InitList()
{
List l;
//向机器申请结点大小的空间,并且把空间地址赋值给l
l=(List)malloc(sizeof(struct Node));
//如果内存申请不成功,返回NULL
if(!l) return NULL;
//头结点的指针域赋值为NULL,并返回头结点
l->Next=NULL;
return l;
}
//打印函数:按照输出格式把合并后的链表打印出来
void print(List l)
{
/*
声明:函数里的形参l代表头结点,
但是头结点的指针并没有丢失,
链表的头结点的指针还保存在实参L3里。
*/
l=l->Next;//因为头结点没有数据,所以指针向后移动一个节点
if(l==NULL)
//如果链表只有头结点(即:链表内没有数据),输出NULL,并返 回。
{
printf("NULL");
return;
}
while(l)
{
if(l->Next==NULL)//如果是最后一个节点,不输出空格
printf("%d",l->data);
else printf("%d ",l->data);//如果不是最后一个节点,输出数据➕空格,且指针向后移动一位。
l=l->Next;
}
}
/*读入函数:
只要不是输入-1,就创建一个节点,把data赋值,
并把创建的新节点的地址连接到链表尾部*/
void read(List l)
{
/*
声明:函数里的形参l代表头结点,
但是头结点的指针并没有丢失,
链表的头结点的指针还保存在实参L1中,
形参l作为指向链尾的标记指针。
。
*/
List tmp;//创建 指向创建的新节点的 临时指针变量->tmp
int data;
scanf("%d",&data);//读入数据
while(data!=-1)
{
tmp=(List)malloc(sizeof(struct Node));//创建新节点
if(!tmp)return;//如果没有创建成功,返回
tmp->data=data//把数据赋值给data
tmp->Next=NULL;//新节点充当链尾,所以链尾节点的Next=NULL
l->Next=tmp;//旧链尾的Next指向创建的新节点
l=tmp;//标记指针变量指向链尾
scanf("%d",&data);//再次输入新数据,进行循环判断
}
return;
}
//合并函数:题目的主要操作函数,把l1和l2函数进行合并,合成l3
void combine(List l1,List l2,List l3)
{/*
声明:
l1,l2,l3都是各链表的标记指针,刚开始传参的时候都指向头结点,但是头指针都保存在传入函数的实参里,所以头指针并没有丢失。
*/
//因为l1和l2头结点都没有数据,所以都向后移动一位
l1=l1->Next;
l2=l2->Next;
//当l1和l2都没有到达链尾时,进行节点data的比较和合并操作
while(l1!=NULL&&l2!=NULL)
{ //进行各节点的data比较
if(l1->data>l2->data)
{ //将data小的结点连接到l3结点末尾,
//l2标记结点向后移动一位
l3->Next=l2;
l2=l2->Next;
}
else//同理
{
l3->Next=l1;
l1=l1->Next;
}
l3=l3->Next;//l3链表结尾的标记指针向后移动一位
}
if(l1==NULL&&l2==NULL) return;//如果两个链表同时结束,则返回
if(l1!=NULL)//如果l2结束了,l1没有结束,则把l1的剩余部分连接到l3的末尾
l3->Next=l1;
else l3->Next=l2;
return;
}
int main()
{
List l1,l2,l3;
l1=InitList();
l2=InitList();
l3=InitList();
read(l1);
read(l2);
combine(l1,l2,l3);
print(l3);
return 0;
}