#include<stdio.h>
#include <malloc.h>
typedef struct linknode
{
int data;
linknode *next;
} Node,*Linklist;//Linklist表示结构体指针
Linklist CreateList_end(int n);//尾插法建立链表
Linklist MergeLinklist(Linklist LA,Linklist LB);//将两个非递减的有序单链表合并成一个单链表
void ShowList(Linklist L);//输出链表内容
int main(void)
{
Linklist L1,L2,L;
int n;
scanf("%d",&n);
L1=CreateList_end(n);
L2=CreateList_end(n);
L=MergeLinklist(L1,L2);
ShowList(L);
return 0;
}
Linklist CreateList_end(int n)
{
Linklist head=(Linklist)malloc(sizeof(Node));
Node *p,*e;
p=head;
int x;
for(int i=0; i<n; i++)//尾插法建立链表
{
e=(Linklist)malloc(sizeof(Node));
scanf("%d",&x);
e->data=x;
p->next=e;
p=e;
}
p->next=NULL;//将链表的最后一个节点的指针域置空
return head;
}
void ShowList(Linklist L)//输出链表内容
{
L=L->next;
while(L)
{
printf("%d ",L->data);
L=L->next;
}
printf("\n");
}
Linklist MergeLinklist(Linklist LA,Linklist LB)//将两个非递减的有序单链表合并成一个单链表
{
Node *pa,*pb;
Linklist LC,r;//将LC初始置空表。pa和pb分别指向两个单链表LA和LB中的第一个节点,r初始值为LC且r始终指向LC的表尾。
pa=LA->next;
pb=LB->next;
LC=LA;
LC->next=NULL;
r=LC;
while(pa!=NULL&&pb!=NULL)//当两个表中均为处理完时,比较选择将较小值节点插入到新表LC中
{
if(pa->data<=pb->data)
{
r->next=pa;
r=pa;
pa=pa->next;
}
else
{
r->next=pb;
r=pb;
pb=pb->next;
}
}
if(pa)//若表LA未完,将表LA中后续元素链到新表LC表尾。
r->next=pa;
else
r->next=pb;//否则将表LA中后续元素链到新表LC表尾。
free(LB);
return LC;
}
合并两个有序单链表
最新推荐文章于 2020-12-31 17:28:55 发布