您的位置:首页 > 理论基础 > 数据结构算法

数据结构 合并两个链表

2009-11-21 02:09 239 查看
1、合并两个链表
问题描述:设A与B分别为两个带有头结点的有序循环链表(所谓有序是指链接点按数据域值大小链接,本题不妨设按数据域值从小到大排列)。请写出将这两个链表合并为一个带头结点的有序循环链表的算法。

*******************************************************************************************

#include<stdio.h>
#include<malloc.h>
#define NULL 0
typedef struct node //建立单链表的顺序存储结构
{
int data;
struct node *next;
}*linklist,Node;

linklist creat(int n) //正序输入n个元素的值,建立带表头结点的循环链表
{

linklist head,r,p;
int x,i;
head=(Node*)malloc(sizeof(Node)); //生成新结点
r=head;
printf("输入元素:/n");
for(i=n;i>0;i--)
{
scanf("%d",&x); //输入元素值
p=(Node*)malloc(sizeof(Node));
p->data=x;
r->next=p;
r=p;
}
r->next=head;
return head;
}//建立单链表

linklist mergelist(linklist c,linklist d)
{
linklist r,p;
linklist ha,hb,hc;

ha=c->next;
hb=d->next;
hc=(Node*)malloc(sizeof(Node));
r=hc;

while(ha!=c&&hb!=d)
{
p=(Node*)malloc(sizeof(Node));

if(ha->data<hb->data)
{
p->data=ha->data;
ha=ha->next;
}
else
{
p->data=hb->data;
hb=hb->next;
}
r->next=p;
r=p;
}
if(ha!=c)
{
while(ha!=c)
{
p=(Node*)malloc(sizeof(Node));
p->data=ha->data;
ha=ha->next;
r->next=p;
r=p;
}
}
else
{
while(hb!=d)
{
p=(Node*)malloc(sizeof(Node));
p->data=hb->data;
r->next=p;
r=p;
hb=hb->next;
}
}
r->next=hc;
return hc;
}//合并链表A,B,返回链表C
void output(linklist head)
{
linklist p;
p=head->next;
do{printf("%d ",p->data);
p=p->next;
}while(p!=head);
printf("/n");
}//输出链表
void main()
{
int n,m;
linklist a,b;
printf("输入链表A要输入元素的个数:");
scanf("%d",&n);
a=creat(n); //创建链表A
printf("输入链表B要输入元素的个数:");
scanf("%d",&m);
b=creat(m); //创建链表B
printf("合成的有序链表为/n");
output(mergelist(a,b)); //输出合成的链表C

}

************************************************************************************
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: