| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 943 人关注过本帖
标题:有序单链表合并(原结点) 有个问题,请高手指教!
只看楼主 加入收藏
lvyan
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2008-4-8
收藏
 问题点数:0 回复次数:5 
有序单链表合并(原结点) 有个问题,请高手指教!
#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 
2008-04-08 13:36
lvyan
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2008-4-8
收藏
得分:0 
在线等答案....
2008-04-08 13:37
yunsuoyan
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2007-10-16
收藏
得分:0 
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;
}
2008-04-08 14:14
lvyan
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2008-4-8
收藏
得分:0 
我刚刚也想出来了..
  但是这样还是存在一个问题..
   要选用哪个链表的头作为合并后的链表头,   
   就需要比较两个链表的头结点数据的大小..
     我修改了一下,加了个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;
}
   这样就比较完美了..
     想了一上午的问题终于想出来了..
     对链表合并的程序有所理解了..
  感谢本贴的回答者..
   我是今天刚进的论坛,
      以后请多指教..
2008-04-08 15:06
yunsuoyan
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2007-10-16
收藏
得分:0 
记得释放不用的节点啊!
2008-04-08 15:23
water95
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2015-4-10
收藏
得分:0 
你写的最后的代码可以给我看看吗?
2015-06-23 09:35
快速回复:有序单链表合并(原结点) 有个问题,请高手指教!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015758 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved