已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。链表结点的结构类型定义如下:
struct node
{
int elem;
node* next;
};
代码:
#include<stdio.h>
#include<stdlib.h>
struct Lnode{
int data;
struct Lnode *next;
};
void initLink(Lnode *&L,int a[],int n){
Lnode *p;
for(int i=0;i<n;i++){
Lnode *tmp = (Lnode *)malloc(sizeof(Lnode));
tmp->data = a[i];
if(i==0) L=p=tmp;
else{
p->next = tmp;
p=p->next;
}
}
p->next = NULL;
}
void printLink(Lnode *L){
while(L){
printf("%d ",L->data);
L = L->next;
}
printf("\n");
}
void diffrence(Lnode *&La,Lnode *Lb){
while(Lb){
Lnode *pre = La,*cur=La->next;
while(cur){
Lnode *tmp;
if(Lb->data==La->data){
tmp = La;
La = La->next;
free(tmp);
break;
}
else if(Lb->data==cur->data){
tmp=cur;
pre->next=cur->next;
cur=pre->next;
free(tmp);
break;
}
pre=pre->next;cur=cur->next;
}
// if(Lb->data==pre->data){
// free(pre);
// }
Lnode *tmp2 = Lb;
Lb=Lb->next;
free(tmp2);
}
}
int main(){
int a[]={2,4,56,7,9,22,44,55,0,89};
int b[]={2,3,4,5,6,7,66,55};
Lnode *LA=NULL;
Lnode *LB=NULL;
int alen=sizeof(a)/sizeof(int);
int blen=sizeof(b)/sizeof(b[0]);
printf("alen=%d blen=%d\n",alen,blen);
initLink(LA,a,alen);
initLink(LB,b,blen);
diffrence(LA,LB);
printLink(LA);
return 0;
}