两个有序单链表的合并(初学者)

作者在 2013-11-10 17:46:19 发布以下内容

/*
数据结构上机实验1:有序单链表合并10.29
*/
#include<stdio.h>
#include<stdlib.h>
#define OK 1    //正常
#define ERROR 0 //错误
typedef int Status; //定义返回值类型
typedef int Elemtype; //定义数据元素类型
typedef struct LNode
 {
  Elemtype data;
  struct LNode *next;
 }LNode,*Linklist;

 Status Createlist_L(Linklist &L,int n)
 {
  int k;
  Linklist p;
   printf("请按递减顺序输入%d个元素:",n);
  L=(Linklist)malloc(sizeof(LNode));
  if(L==NULL)
 return ERROR;   //头插链表
  L->next=NULL;  //将最后一个节点的指针域赋空
  for(k=n;k>0;k--)
  {
   p=(Linklist)malloc(sizeof(LNode));
   if(p==NULL)
    return ERROR;
   scanf("%d",&p->data);
   p->next=L->next;
   L->next=p;
  }//for
return OK;
 }//status建立n个节点的单链表

void Display(Linklist &L)
 {
  Linklist p=L;
  p=p->next; //指针指到有数据的第一个节点
  while(p!=NULL)
  {
    printf("%d,",p->data);
      p=p->next;
  }

 }//输出单链表

void Unlist(Linklist &la,Linklist &lb)
{
 Linklist ha,h1,hb,temp;  //定义h1,ha两个相邻节点指针,便于在两者中间进行插入操作;temp用于暂时指向要被插入或删除的节点
 h1=ha=la;  
 ha=ha->next;
 hb=lb->next;
 while(ha!=NULL&&hb!=NULL)
 {
  if(hb->data>ha->data)
  {
   h1=h1->next;
   ha=ha->next;
  }  //大于时h1,ha向后以一个节点作比较
  else
   if(hb->data<ha->data)  //此时插入到h1所指节点后面
   {
       h1->next=hb;
       temp=hb;   //将b节点的地址付给temp,便于hb后移地址不丢失
       hb=hb->next; //hb后移
       temp->next=ha; 
       h1=temp;    //把temp节点插入到h1后
   }
     else
   if(ha->data==hb->data)
   {
                temp=hb->next;
       free(hb);  //释放hb空间
       hb=temp->next;  //hb后移一节点
       h1->next=temp;
       temp->next=ha;
   }
 //有值相同的节点删去h1指向hb的下一个节点,进入比较
 }
 if(ha==NULL&&hb!=NULL)
     h1->next=hb;    //当b节点有剩余时,直接连到la末尾极
}//合并两个有序链表


 int main()
 {
  int m,n;
  Linklist la,lb;
  printf("请输入链表a的长度:\n");
  scanf("%d",&m);
  printf("请输入链表b的长度:\n");
  scanf("%d",&n);
  Createlist_L(la,m);  //建立单链表
  Createlist_L(lb,n);
  Unlist(la,lb);
  Display(la);
     return 0;
 }
 

参考书目:清华大学<数据结构>

默认分类 | 阅读 1960 次
文章评论,共0条
游客请输入验证码
浏览1960次
文章分类
文章归档
最新评论