| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1575 人关注过本帖
标题:新手请教:把一个链表插入到另一个链表中,写好的程序运行不了.谢谢
只看楼主 加入收藏
friendbcc008
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-10-4
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
新手请教:把一个链表插入到另一个链表中,写好的程序运行不了.谢谢
#include<stdio.h>

struct stu
{
  long num;
  float score;
  struct stu *next;

};

struct stu * insert(struct stu *head1,struct stu *head2)  //两表都不为空,把head2表插入到head1中,按num的大小插入到合适的位置上,最后形成新的链表.
{
  struct stu *p1,*p2,*pnew;      //p1,p2用于head1中,pnew用于head2中
  
    pnew=head2;
    while(pnew!=NULL)
     {  p1=head1;
        while((pnew->num>p1->num)&&(p1->next!=NULL))
        {
            p2=p1;
            p1=p1->next;
        }
        if(pnew->num<=p1->num)
        {
            pnew->next=p1;              
            if(p1==head1) head1=pnew;
            else p2->next=pnew;
        }
        else
        {
            p1->next=pnew;
            pnew->next=NULL;
        }
        
        
        pnew=pnew->next;  
     }
 
  
  return head1;

}

int main()
{
  struct stu *head3,*head4,*p,*p0,*qp=NULL;
  struct stu a,b,c,d,e,f;
  a.num=1002;a.score=80;
  b.num=1004;b.score=76;
  c.num=1005;c.score=92;
  d.num=1001;d.score=88;
  e.num=1003;e.score=70;
  f.num=1006;f.score=69;
 head3=&a;a.next=&b;b.next=&c;c.next=NULL;
 head4=&d;d.next=&e;e.next=&f;f.next=NULL;
 
 p=head3;p0=head4;
 while(p)
 {
   printf("%ld %5.1f\n",p->num,p->score);  //先输出head1表
   p=p->next;
 }
 while(p0)
 {
   printf("%ld %5.1f\n",p0->num,p0->score); //再输出head2表
   p0=p0->next;
 }
 qp=insert(head3,head4);       //这个有问题,请帮忙看下.
 while(qp)
 {
   printf("%ld %5.1f\n",qp->num,qp->score); //再输出两表按num从小到大合并好的表
   qp=qp->next;
 }
 printf("sucsess!\n");
 return 0;
}
搜索更多相关主题的帖子: include insert 
2013-10-04 15:12
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:7 
刚才先发了一帖,但是发觉又不完全是那个问题,因为再往下看以后发现你的插入操作整个逻辑实在有点混乱。
给点建议吧。
1,引入头结点,头结点不存储任何信息,作为链表头部,有利于操作,这样你不需要判断是否在头部进行插入;
2,你的插入情况考虑过少,比如两个都是空链表的情况,其中任何一个链表是空链表的情况,都会导致你的程序在插入部分无法运行。

[ 本帖最后由 baobaoisme 于 2013-10-4 17:02 编辑 ]
2013-10-04 16:44
friendbcc008
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-10-4
收藏
得分:0 
有人吗?版主给看下呀...晕..想了一天都不明白哪里错了...
2013-10-04 17:20
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:0 
逻辑错误这个只能自己好好想想,你逻辑错误,那别人帮你也只能帮你写同样功能的代码,而从你本身的代码改对别人来说是一种煎熬。
2013-10-04 17:23
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:7 
     else
        {
            p1->next=pnew;
            pnew->next=NULL;
        }
这里好像有问题,此时应是head2的某结点大于head1末结点情况,设为NuLL,说明就中断了head2的信息。

www.qunxingw.wang
2013-10-05 14:02
Explorerlxz
Rank: 9Rank: 9Rank: 9
来 自:zzu
等 级:蜘蛛侠
威 望:4
帖 子:302
专家分:1032
注 册:2013-4-24
收藏
得分:7 
程序代码:
#include<stdio.h>
struct stu
{
  long num;
  float score;
  struct stu *next;
};
struct stu * insert(struct stu *head1,struct stu *head2)
{
  struct stu *p1,*p2,*pnew;
    pnew=head2;
    while(pnew!=NULL)
     {
         p1=head1;
        while((pnew->num>p1->num)&&(p1->next!=NULL))
        {
            p2=p1;
            p1=p1->next;
        }
        if(pnew->num<=p1->num)
        {
            head2=pnew->next;
            pnew->next=p1;
            if(p1==head1) head1=pnew;
            else p2->next=pnew;
        }
        else
        {
            p1->next=pnew;
            head2=pnew->next;
        }
        pnew=head2;
     }
  return head1;
}

int main()
{
  struct stu *head3,*head4,*p,*p0,*qp=NULL;
  struct stu a,b,c,d,e,f;
  a.num=1002;a.score=80;
  b.num=1004;b.score=76;
  c.num=1005;c.score=92;
  d.num=1001;d.score=88;
  e.num=1003;e.score=70;
  f.num=1006;f.score=69;
head3=&a;a.next=&b;b.next=&c;c.next=NULL;
head4=&d;d.next=&e;e.next=&f;f.next=NULL;

p=head3;p0=head4;
while(p)
{
   printf("%ld %5.1f\n",p->num,p->score);  //先输出head1表
   p=p->next;
}
while(p0)
{
   printf("%ld %5.1f\n",p0->num,p0->score); //再输出head2表
   p0=p0->next;
}
qp=insert(head3,head4);       //这个有问题,请帮忙看下.
while(qp)
{
   printf("%ld %5.1f\n",qp->num,qp->score); //再输出两表按num从小到大合并好的表
   qp=qp->next;
}
printf("sucsess!\n");
return 0;
}
2013-10-06 22:07
Explorerlxz
Rank: 9Rank: 9Rank: 9
来 自:zzu
等 级:蜘蛛侠
威 望:4
帖 子:302
专家分:1032
注 册:2013-4-24
收藏
得分:0 
if(pnew->num<=p1->num)
        {
            pnew->next=p1;              
            if(p1==head1) head1=pnew;
            else p2->next=pnew;
        }
        else
        {
            p1->next=pnew;
            pnew->next=NULL;
        }
        
        
        pnew=pnew->next;  
这几行代码有问题,执行完if语句中的内容后pnew->next已经变成p1了,又没有用另一个指针指向数组head2的头部,这还搞毛呀!这时应该先保存pnew->next,如上面的
head2=pnew->next,否则后面针对pnew的操作都编程对p1的操作了,乱七八糟的,所以错了,以后写链表要先画图!搞清关系,还有你这个else语句中的pnew->next=NULL;是什么意思?如果后面还有元素没执行,就这样结束???这里也应该有个head2=pnew->next,以便读取pnew->next后面的内容,因此,后面的pnew=pnew->next就可以直接改写成pnew=head2了!
2013-10-06 22:16
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:0 
回复 7楼 Explorerlxz
思路很清晰。感觉此处可以直接把HEAD2链余下的都大于HEAD1末结点,优化,一次性接上去。
 else
        {
            p1->next=pnew;
            break;
            //head2=pnew->next;
        }

www.qunxingw.wang
2013-10-06 23:17
快速回复:新手请教:把一个链表插入到另一个链表中,写好的程序运行不了.谢谢
数据加载中...
 
   



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

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