| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1080 人关注过本帖
标题:运行错误:从两链表中删除相同学号的结点,求帮助!
只看楼主 加入收藏
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
酌情使用吧好好看下,然后在纸上一点一点模拟代码的执行过程,记录好每个变量的变化,你就会明白了,不然说不清楚的

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-06 00:01
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 7楼 神龙赖了
小赖,谢谢您,费这么大功夫帮我找问题。
 我把“while((pb1->num!=pa1->num)&&(pa1!=NULL))”中的"pa1!=NULL"改成"pa1->next!=NULL"运行就正确了。
这两者到底有什么区别啊,什么时候该用"pa1!=NULL",什么时候该用"pa1->next!=NULL",不就是遍历到链表末尾嘛。
有空还望您指点一二。
2013-01-06 00:04
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 8楼 yaobao
回头再看了下你的分析,又明白了许多。
2013-01-06 00:42
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 11楼 yaobao
还有,那个释放内存,怎么释放?在我程序上圈圈呗。
2013-01-06 00:44
轻风无言
Rank: 2
等 级:论坛游民
帖 子:27
专家分:25
注 册:2012-12-19
收藏
得分:5 
#include <stdlib.h>
#include <stdio.h>
 
typedef struct student
 {
     int num;
     char name[20];
     struct student *next;
 }Code;
 
Code *Creat(int length);
Code *Delete(Code *ahead,Code *bhead);
void Print(Code *head);

void main()
 {
     
     Code *ahead,*bhead;
     int a_length,b_length;
     printf("input length of list_a:\n");
     scanf("%d",&a_length);
     ahead=Creat(a_length);
     Print(ahead);
     printf("input length of list_b:\n");
     scanf("%d",&b_length);
     bhead=Creat(b_length);
     Print(bhead);
     ahead=Delete(ahead,bhead);
     Print(ahead);
 }
 
//建立链表函数
 Code *Creat(int length)
 {
     Code *p1,*p2,*head;
     int i = 1;
     printf("Now,input the students' information:\n");
      head = ( Code * )malloc( sizeof( Code ) );
        head->next = NULL;   
      p1 = p2 = head;
      while( i <= length ){
            p1=(Code *)malloc(sizeof(Code));
            scanf("%d %s",&p1->num,p1->name);
            p2->next = p1;
            p2 = p1;
            i++;
      }
      p1->next = NULL;
     return head;
 }
 
//输出链表函数
 void Print(Code *head)
 {
     Code *p;
     p=head->next;
     if( p !=NULL)
         do
         {
             printf("number:%d  name:%s\n",p->num,p->name);
             p=p->next;
         }while(p!=NULL);
 }
 
//删除相同学号函数
 Code *Delete(Code *ahead,Code *bhead)
 {
     Code *pa1,*pa2,*pb1;
     pb1=bhead->next;
 
    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;
 }
     return ahead;
 }
//我刚刚在你的程序上改了下,用的带头结点的链表,运行了下可以,不知道结果符不符合要求,你试试
2013-01-06 01:31
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
释放内存就是和申请内存malloc相对应的free,要养成及时释放内存的习惯(T版告诉的),每当一段内存无用之后马上释放掉,可以防止很多问题的出现。
至于你说的"pa1!=NULL"改成"pa1->next!=NULL"运行就正确的问题,你想啊,你原本有5个苹果,被我吃了4个,神龙懒了吃了一个,结果他吃馋了还向你要,结果是什么?结果是你当时就急了“没了,都没了,我还没吃你呢。”
系统大概和你一样的心情所以“嘣”的一声弹出个警告,上面写着‘没了,pa1都等于NULL了我还上哪找pa1->num去和pb1->num 比较我,我还没吃呢’。
说白了就是多比较一次少比较一次的问题。

新手路过,顺便瞎说

[ 本帖最后由 yaobao 于 2013-1-6 10:17 编辑 ]

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-06 10:15
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
以下是引用轻风无言在2013-1-6 01:31:51的发言:

#include
#include
 
typedef struct student
 {
     int num;
     char name[20];
     struct student *next;
 }Code;
 
Code *Creat(int length);
Code *Delete(Code *ahead,Code *bhead);
void Print(Code *head);

void main()
 {
     
     Code *ahead,*bhead;
     int a_length,b_length;
     printf("input length of list_a:\n");
     scanf("%d",&a_length);
     ahead=Creat(a_length);
     Print(ahead);
     printf("input length of list_b:\n");
     scanf("%d",&b_length);
     bhead=Creat(b_length);
     Print(bhead);
     ahead=Delete(ahead,bhead);
     Print(ahead);
 }
 
//建立链表函数
 Code *Creat(int length)
 {
     Code *p1,*p2,*head;
     int i = 1;
     printf("Now,input the students' information:\n");
      head = ( Code * )malloc( sizeof( Code ) );
        head->next = NULL;   
      p1 = p2 = head;
      while( i <= length ){
            p1=(Code *)malloc(sizeof(Code));
            scanf("%d %s",&p1->num,p1->name);
            p2->next = p1;
            p2 = p1;
            i++;
      }
      p1->next = NULL;
     return head;
 }
 
//输出链表函数
 void Print(Code *head)
 {
     Code *p;
     p=head->next;
     if( p !=NULL)
         do
         {
             printf("number:%d  name:%s\n",p->num,p->name);
             p=p->next;
         }while(p!=NULL);
 }
 
//删除相同学号函数
 Code *Delete(Code *ahead,Code *bhead)
 {
     Code *pa1,*pa2,*pb1;
     pb1=bhead->next;
 
    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;
 }
     return ahead;
 }
//我刚刚在你的程序上改了下,用的带头结点的链表,运行了下可以,不知道结果符不符合要求,你试试
              pa2->next = pa1->next;              
              free( pa1 );
              pa1 = pa1->next;
pa2->next = pa1->next;              
              free( pa1 );
              pa1 = pa1->next;
你把pa1都释放了,pa1->next也会跟着挂了,你确定输入两个以上能运行...不能无视7楼啊...

 不对,我擦,我才吃了一个,猫哥你吃了四个,要急也不能跟我急啊...

I have not failed completely
2013-01-06 11:51
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
我吃完就走了,你吃完还要,当然跟你急

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-06 11:57
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
我倒...

I have not failed completely
2013-01-06 12:08
轻风无言
Rank: 2
等 级:论坛游民
帖 子:27
专家分:25
注 册:2012-12-19
收藏
得分:0 
回复 17楼 神龙赖了
我输入了两个试了的,free(pa1)不会影响后面的啊,我指针变量还在啊,pa1->next还在,
2013-01-06 12:21
快速回复:运行错误:从两链表中删除相同学号的结点,求帮助!
数据加载中...
 
   



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

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