数据结构 合并两个链表
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
}
************************************************************************************
问题描述:设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
}
************************************************************************************
相关文章推荐
- 02-线性结构1 两个有序链表序列的合并——中国大学MOOC-陈越、何钦铭-数据结构-2017秋
- 数据结构 - 有两个链表,第一个升序,第二个降序,合并为一个升序链表(C++)
- c语言数据结构中两个有序链表合并为一个新链表
- PAT数据结构_02-线性结构1 两个有序链表序列的合并 (15分)
- [数据结构]02-线性结构1 两个有序链表序列的合并
- 数据结构之将两个递增的有序链表合并为一个递增的有序链表
- 【MOOC—数据结构习题】两个有序链表序列的合并
- 数据结构_中国大学MOOC(慕课)——两个有序链表序列的合并问题
- 数据结构 链表 合并两个有序的单链表 C语言版
- PTA数据结构之两个有序链表序列的合并
- 数据结构 两个链表合并-python
- 数据结构 02-线性结构1 两个有序链表序列的合并
- 数据结构-合并两个排序的链表
- 2-11. 两个有序链表序列的合并(15):链表数据结构基础练习
- (LeetCode刷题)合并两个有序的链表和数组
- 剑指Offer系列---(19)合并两个排序的链表
- 将两个有序链表合并成一个有序链表
- 合并两个排序链表
- 合并两个有序的链表
- 合并两个有序单链表,使得合并后的链表仍然有序