链表求集合差集问题!!!
程序代码:#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链表中没有的元素!我觉得我的那个实现算法的函数没问题啊!我反复琢磨还是没发现到底错哪了!现在还觉得压根没错
!希望路过的前辈给看看到底是哪错了!不胜感激!找不出自己的错误我无语啊




