| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1080 人关注过本帖
标题:运行错误:从两链表中删除相同学号的结点,求帮助!
取消只看楼主 加入收藏
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
运行错误:从两链表中删除相同学号的结点,求帮助!
程序代码:
/*有2个链表a和b,设结点中包括学号、姓名。从a链中删去与b链中
有相同学号的那些结点.*/
#include<stdlib.h>
#include"stdio.h"
typedef struct student
{
    int num;
    char name[20];
    struct student *next;
}Code;
void main()
{
    Code *Creat(int length);
    Code *Delete(Code *ahead,Code *bhead);
    void Print(Code *head);
    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;
    printf("Now,input the students' information:\n");
    for(i=0;i<length;i++)
    {
        p1=(Code *)malloc(sizeof(Code));
        if(i==0)
            head=p2=p1;
        else
            p2->next=p1;
        p2=p1;
        scanf("%d %s",&p1->num,p1->name);
    }
    p1->next=NULL;
    return head;
}

//输出链表函数
void Print(Code *head)
{
    Code *p;
    p=head;
    if(head!=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;
    while(pb1!=NULL)             //让b表中的每个结点和a表比较
    {
        pa1=ahead;
        while((pb1->num!=pa1->num)&&(pa1!=NULL))
        {
            pa2=pa1;             //pa2始终指向pa1的前一个结点
            pa1=pa1->next;
        }
        if(pb1->num==pa1->num)         //两链表中学号相同
            if(pa1==ahead)             //a链表中当前结点为第一个结点
                ahead=pa1->next;       //使ahead指向a链第二个结点
            else
                pa2->next=pa1->next;   //删除pa1所指结点
        pb1=pb1->next;                 //pb1移向下一个结点
    }
    return ahead;
}
//问题出在 删除学号 这个函数,一直找不出原因。希望大家多多帮忙,找出问题。

[ 本帖最后由 a4811 于 2013-1-5 21:04 编辑 ]
搜索更多相关主题的帖子: 姓名 
2013-01-05 18:30
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 2楼 azzbcc
兄弟,输出函数哪里有问题 ,你说明白撒。
2013-01-05 19:17
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 2楼 azzbcc
OK。
我知道了。
2013-01-05 19:42
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
通宵等待.
2013-01-05 21:07
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 9楼 yaobao
确实,我刚刚将"pa1!=NULL"改成"pa1->next!=NULL".运行正确。你跟我细说下这这二者的区别吗?我老是帮它们俩等价,分不清在循环中到底该使用哪个。
如果这个我没弄清楚,以后在其它程序中还会犯这样的区别,bao哥。
2013-01-05 23:57
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
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
快速回复:运行错误:从两链表中删除相同学号的结点,求帮助!
数据加载中...
 
   



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

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