您的位置:首页 > 其它

合并两个有序单链表

2017-05-18 18:48 309 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: