标题:链表求集合差集问题!!!
只看楼主
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
结帖率:100%
已结贴  问题点数:50 回复次数:10 
链表求集合差集问题!!!
程序代码:
#include<stdio.h>
#include<malloc.h>
struct linknode
{
    int data;
    struct linknode *next;
};
struct linknode *create()//创建单链表
{
    int d;
    int i=1;
    struct linknode *head,*s,*t;
    head=NULL;
   
    printf("建立一个单链表,data域数据已0结束:\n");
    while(1)
    {
        printf("%d:",i);
        scanf("%d",&d);
        if(d==0) 
             break;

        if(i==1)//建立第一个结点
        {
            head=(struct linknode *)malloc(sizeof(struct linknode));
            head->data=d;
            head->next=NULL;
            t=head;
        }
        else//建立其余结点
        {
            s=(struct linknode *)malloc(sizeof(struct linknode));
            s->data=d;
            s->next=NULL;
            t->next=s;
            t=s;
        }
        i++;
    }
    return head;
}
void disp(struct linknode *head)//输出结点数据
{
    struct linknode *p=head;
    printf("输出一个单链表:\n");
    if(p==NULL)
        printf("");
    while(p!=NULL)
    {
        printf("%d",p->data);
        p=p->next;
    }
    printf("\n");
}
struct linknode *subs(struct linknode *ha,struct linknode *hb)
{
    int flag=0;

    struct linknode *r,*s,*pa,*pb,*head;
    pa=ha,pb=hb;
   
    s=(struct linknode *)malloc(sizeof(struct linknode));//哨兵结点
    s->next=NULL;
    r=s;
    head=s;
    while(pa!=NULL)
    {
        flag=0;
        for(pb=hb;pb!=NULL;pb=pb->next)//找到数据域相同的结点*/
            if(pa->data==pb->data)
            {
                flag=1;//结点相同就跳出
                break;
            }


        if(flag)//若结点相同就指向下一个结点即删除当前结点
        {
            pa=pa->next;
            free(pa);
        }
        else//没有相同的结点就保留
        {
            r->next=pa;
            r=pa;
            pa=pa->next;
            r->next=NULL;
        }
    }
       
        head=s->next;
        free(s);//释放哨兵结点
       
       
   
    return head;
}
   
void main()
{
    struct linknode *head_1,*head_2,*head_3;
    head_1=create();
    head_2=create();
    head_3=subs(head_1,head_2);
    printf("集合A,和集合相减后的结果为\n");
    disp(head_3);
}
问题描述:
如果A链表的数据为2 3 5 8 B链表中为3 4 5那么最后输出为2 8、就是输出A链表中有而B链表中没有的元素!我觉得我的那个实现算法的函数没问题啊!我反复琢磨还是没发现到底错哪了!现在还觉得压根没错!希望路过的前辈给看看到底是哪错了!不胜感激!找不出自己的错误我无语啊
搜索更多相关主题的帖子: 链表 差集 
2010-09-24 22:48
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
得分:10 
遮天大哥的代码很强
不过。。。。。。真的很长...

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2010-09-24 23:51
易哓天
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:105
注 册:2010-9-20
得分:0 
我们也在学这个,不过我还没怎么看呢,额

匈奴未灭,何以为家
2010-09-25 00:06
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:20 
struct linknode *subs(struct linknode *ha,struct linknode *hb)
{
    int flag=0;

    struct linknode *r,*s,*pa,*pb,*head, *temp;
    pa=ha,pb=hb;
   
    s=(struct linknode *)malloc(sizeof(struct linknode));//哨兵结点
    s->next=NULL;
    r=s;
    head=s;
    while(pa!=NULL)
    {
        flag=0;
        for(pb=hb;pb!=NULL;pb=pb->next)//找到数据域相同的结点
            if(pa->data==pb->data)
            {
                flag=1;//结点相同就跳出
                break;
            }


        if(flag)//若结点相同就指向下一个结点即删除当前结点
        {
            temp = pa;
            pa=pa->next;
            free(temp);

        }
        else//没有相同的结点就保留
        {
            r->next=pa;
            r=pa;
            pa=pa->next;
            r->next=NULL;
        }
    }
      
        head=s->next;
        free(s);//释放哨兵结点
      
      
   
    return head;
}
2010-09-25 00:16
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
应该贴到 数据结构版去
2010-09-25 00:17
ppfly
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:297
专家分:1956
注 册:2009-5-17
得分:20 
回复 楼主 遮天云
问题出在free(pa)上,你把free(pa)删掉以后在运行就是正确的了。

原因在于:执行free(pa)以后,s->next就不确定了,比如你输入A链表3 4 6 0,输入B链表4 7 0,在head=head->next后面加上printf("%d\t",head->data);语句,执行一下就知道了

执行pa=pa->next之后,应该释放pa之前的结点而不是释放pa。楼上正解

[ 本帖最后由 ppfly 于 2010-9-25 10:19 编辑 ]

********多贴代码,少说空话*******
2010-09-25 00:28
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:0 
以下是引用vandychan在2010-9-24 23:51:33的发言:

遮天大哥的代码很强
不过。。。。。。真的很长...
呃!还可以化简吗?就这几个函数啊
2010-09-25 10:28
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:0 
以下是引用寒风中的细雨在2010-9-25 00:17:41的发言:

应该贴到 数据结构版去
谢谢提醒哈!就是在C板块混久了,习惯性的就直接发到这里了
2010-09-25 10:29
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:0 
谢谢楼上各位的指点
2010-09-25 10:30
ppfly
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:297
专家分:1956
注 册:2009-5-17
得分:0 
在哪发都一样,我倒觉得数据结构不应该单独开版,脱离了C\C++等程序语言,数据结构怎么存在

********多贴代码,少说空话*******
2010-09-25 10:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-321259-1-1.html




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

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