当前位置: 代码迷 >> C语言 >> 有序单链表合并(原结点) 有个问题,请高手指教!
  详细解决方案

有序单链表合并(原结点) 有个问题,请高手指教!

热度:157   发布时间:2008-04-08 13:36:29.0
有序单链表合并(原结点) 有个问题,请高手指教!
#include<stdlib.h>
#include<stdio.h>
#define ST struct a
ST         //声明结构体
{ int num;
  ST *next;
  };

ST *ceart()  //创建链表
{ ST *head,*p1,*p2;
   int n=0;
  p1=p2=(ST *)malloc(sizeof(ST));
  printf("input is:\n");
  scanf("%d",&p1->num);
  while(p1->num!=0)
  {  n++;
  if( n==1)  head=p1;
  else p2->next=p1;
  p2=p1;
  p1=(ST *)malloc(sizeof(ST));
  scanf("%d",&p1->num);
  }
  p2->next=NULL;
  free(p1);
  return head;
}


ST *print(ST *h)  //输出
{
   while(h!=NULL)
   {
     printf("%d ",h->num);
      h=h->next;
     }
}

ST *link(ST *L1,ST *L2)   //合并链表
{ ST *p1,*p2,*p3,*head;
    head=p3=L1;
    p1=L1->next;
    p2=L2->next;
    while(p1&&p2)
    {  if(p1->num<=p2->num)
       { p3->next=p1; p3=p1; p1=p1->next; }
       else
     {  p3->next=p2; p3=p2; p2=p2->next; }
    }
    p3->next=p1?p1:p2;
    return head;
}




main()
{  ST *h1,*h2,*head;  clrscr();
    h1=ceart();
    h2=ceart();
    head=link(h1,h2);
    print(head);
}


我是按书上分析写的,但这个存在一个问题:
     两个表合并之后,第二个表(L2所指)的第一个结点的数据合并不上去.
  例如:  输入: 5   9    14     0
         输入: 6   11    16    0
     输出:5   9    11    14    16   
     不知道哪个位置有问题,请高手赐教!.
搜索更多相关的解决方案: 结点  单链  num  

----------------解决方案--------------------------------------------------------
在线等答案....
----------------解决方案--------------------------------------------------------
ST *link(ST *L1,ST *L2)   //合并链表
{ ST *p1,*p2,*p3,*head;
    head=p3=L1;
    p1=L1->next;
    p2=L2->next; 此处修改为:p2=L2;   
    {  if(p1->num<=p2->num)
       { p3->next=p1; p3=p1; p1=p1->next; }
       else
     {  p3->next=p2; p3=p2; p2=p2->next; }
    }
    p3->next=p1?p1:p2;
    return head;
}
----------------解决方案--------------------------------------------------------
我刚刚也想出来了..
  但是这样还是存在一个问题..
   要选用哪个链表的头作为合并后的链表头,   
   就需要比较两个链表的头结点数据的大小..
     我修改了一下,加了个if ..  else ....
     ST *link(ST *L1,ST *L2)
  { ST *p1,*p2,*p3,*head;

   if(L1->num<=L2->num)
   { head=p3=L1;
    p1=L1->next;
    p2=L2; }
   else
    { head=p3=L2;
      p1=L1;
      p2=L2->next;
      }
    while(p1&&p2)
    {  if(p1->num<=p2->num)
       { p3->next=p1; p3=p1; p1=p1->next; }
       else
     {  p3->next=p2; p3=p2; p2=p2->next; }
    }
    p3->next=p1?p1:p2;
    return head;
}
   这样就比较完美了..
     想了一上午的问题终于想出来了..
     对链表合并的程序有所理解了..
  感谢本贴的回答者..
   我是今天刚进的论坛,
      以后请多指教..
----------------解决方案--------------------------------------------------------
记得释放不用的节点啊!
----------------解决方案--------------------------------------------------------
  相关解决方案