数据结构 合并两个链表

来源:互联网 发布:java程序开发培训班 编辑:程序博客网 时间:2024/05/22 13:16

1、合并两个链表

问题描述:设AB分别为两个带有头结点的有序循环链表(所谓有序是指链接点按数据域值大小链接,本题不妨设按数据域值从小到大排列)。请写出将这两个链表合并为一个带头结点的有序循环链表的算法。

 

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

#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
 
}

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

 

原创粉丝点击