| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1080 人关注过本帖
标题:运行错误:从两链表中删除相同学号的结点,求帮助!
只看楼主 加入收藏
轻风无言
Rank: 2
等 级:论坛游民
帖 子:27
专家分:25
注 册:2012-12-19
收藏
得分:0 
回复 17楼 神龙赖了
刚刚还试了下,没问题,我释放pa1之前已经把pa1->next赋值给了pa2->next了,所以pa1就悬空了啊,我释放了没问题啊
2013-01-06 12:28
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
程序代码:
        if(  pa1 != NULL)         //两链表中学号相同
         {   
              pa2->next = pa1->next;             
              free( pa1 );
              printf("%d\n",pa1 ->next);
              pa1 = pa1->next;
              printf("%s\n",pa1 ->name);
         }
测试一下就知道了,free(pa1)后调用pa1 ->next出现的地址的值是一个负数,说明已经出错了
在调整pa1指针后再输出pa1 ->name程序崩溃,说明pa1->next是一个错误的操作
但是这里的if()语句已经是最后的一个操作了,因为
程序代码:
 while(pb1!=NULL)             //让b表中的每个结点和a表比较
     {
         pa1=ahead->next;
            pa2 = ahead;
       
        while((pa1!=NULL)&&(pb1->num !=pa1->num))
         {
        
        
             pa1=pa1->next;
                 pa2 = pa2->next;
        
         }
         printf("运行\n");
           
       
        if(  pa1 != NULL)         //两链表中学号相同
         {   
              pa2->next = pa1->next;             
              free( pa1 );
              pa1 = pa1->next;
           
           
          }
            pb1 = pb1->next;
}
while(pb1!=NULL)             //让b表中的每个结点和a表比较
     {
         pa1=ahead->next;

会将pa1再次指向文件的开头
但是pa1 = pa1 ->next这个操作是非法的,没有导致程序崩溃是幸运的...

I have not failed completely
2013-01-06 12:35
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
程序代码:
if(  pa1 != NULL)         //两链表中学号相同
         {  
              pa2->next = pa1->next;            
              free( pa1 );
              printf("%d\n",pa1 ->next);
              pa1 = pa1->next;
              printf("%s\n",pa1 ->name);
         }
你的意思应该是 pa1 = pa2 ->next,pa1 指向的结构已经释放,不可能还存在pa1 ->next
但是你把pa1 ->next指向的地址保存在了pa2 ->next中,所以应调用pa2 ->next
呵呵,也许是粗心了吧...

I have not failed completely
2013-01-06 12:39
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 15楼 轻风无言
感谢。问题就是出在这里:
while((pa1!=NULL)&&(pb1->num !=pa1->num))

而我写成:while((pb1->num !=pa1->num)&&(pa1!=NULL)
就像楼上神龙所说,系统计算顺序是从左往右的,当pa1==NULL时,先进行pa1->num运算,造成内存泄露,程序崩溃,后面的 pa1!=NULL 判断不了。
而写成:while((pa1!=NULL)&&(pb1->num !=pa1->num)),当pa1==NULL时,先进行pa1!=NULL判断,因pa1==NULL,循环结束,未执行pa1->num。
接着,只需在下面进行“pa1!=NULL”判断。
2013-01-06 13:58
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 23楼 神龙赖了
轻风无言 应该是将pa1=pa2->next错写成 pa1=pa1->next了。
其实,pa1=pa2->next这句是多余的,每次比较都是从a表头开始。
2013-01-06 14:10
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
回复 25楼 a4811
楼主正确

I have not failed completely
2013-01-06 14:57
轻风无言
Rank: 2
等 级:论坛游民
帖 子:27
专家分:25
注 册:2012-12-19
收藏
得分:0 
恩恩,这样讨论还蛮有意思的啊;还能找到好多小的自己容易犯的错误
2013-01-06 16:31
快速回复:运行错误:从两链表中删除相同学号的结点,求帮助!
数据加载中...
 
   



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

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