求集合(用单链表表示)的并、交和差运算
1.问题描述
集合运算如下:
原集合A:c a e h
原集合B:f h b g d a
有序集合A:a c e h
有序集合B:a b d f g h
集合的并C:a b c d e f g h
集合的交C:a h
集合的差C:c e
2.算法设计与代码实现
#include<bits/stdc++.h>
using namespace std;
typedef char ElemType;
typedef struct Lode
{
ElemType data;
struct Lode* next;
}Link,*LinkList;
bool init_head(LinkList &L);
int tail_insert(LinkList &L,ElemType a[6],int len);
bool display(LinkList L);
int Link_length(LinkList L);
int Sort(LinkList &L,int len);
int uss(LinkList &A,LinkList &B,LinkList &C);
int inters(LinkList &A,LinkList &B,LinkList &C);
int ds(LinkList &A,LinkList &B,LinkList &C);
int main()
{
LinkList A,B,C;
char a[5]={"caeh"};
char b[7]={"fhbgda"};
init_head(A);
init_head(B);
tail_insert(A,a,4);
display(A);
int lenA=Link_length(A);
tail_insert(B,b,6);
display(B);
int lenB=Link_length(B);
Sort(A,lenA);
display(A);
Sort(B,lenB);
display(B);
init_head(C);
int len=lenA<lenB?lenA:lenB;
inters(A,B,C);
cout<<"A和B的交集是:";
display(C);
init_head(C);
cout<<"A和B的并集是:";
uss(A,B,C);
display(C);
cout<<"A-B的差集是:";
init_head(C);
ds(A,B,C);
display(C);
return 0;
}
bool init_head(LinkList &L)
{
L=(LinkList)malloc(sizeof(Link));
if(!L)
{
cout<<"allocation failure!"<<endl;
return 0;
}
else L->next=NULL;
L->data=' ';
return 1;
}
int tail_insert(LinkList &L,ElemType *a,int len)
{
LinkList p;
int i;
p=L;
for(i=0;i<len;i++)
{
LinkList q=(LinkList)malloc(sizeof(Link));
q->data=a[i];
q->next=p->next;
p->next=q;
p=q;
}
p->next=NULL;
return 0;
}
bool display(LinkList L)
{
LinkList p=L;
while(p)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<endl;
return 1;
}
int Link_length(LinkList L)
{
LinkList p=L;
int length=0;
while(p)
{
p=p->next;
++length;
}
return length-1;
}
int Sort(LinkList &L,int len)
{
LinkList p,q;
int i,j;
LinkList t=(LinkList)malloc(sizeof(Link));
for(i=0;i<len;i++)
{
p=L->next;
q=p->next;
while(q)
{
if(q->data<p->data)
{
t->data=q->data;
q->data=p->data;
p->data=t->data;
}
p=q;
q=p->next;
}
}
return 0;
}
int inters(LinkList &A,LinkList &B,LinkList &C)
{
LinkList p=A->next,q=B->next,r=C;
while(p&&q)
{
if(p->data==q->data)
{
LinkList k=(LinkList)malloc(sizeof(Link));
k->data=p->data;
k->next=r->next;
r->next=k;
r=k;
p=p->next;
q=q->next;
}
else if(p->data>q->data)
{
q=q->next;
}
else p=p->next;
}
return 0;
}
int uss(LinkList &A,LinkList &B,LinkList &C)
{
LinkList p=A->next,q=B->next,r=C;
while(p||q)
{
if(p->data==q->data)
{
LinkList k=(LinkList)malloc(sizeof(Link));
k->data=p->data;
k->next=r->next;
r->next=k;
r=k;
p=p->next;
q=q->next;
}
else if(p->data>q->data)
{
LinkList k=(LinkList)malloc(sizeof(Link));
k->data=q->data;
k->next=r->next;
r->next=k;
r=k;
q=q->next;
}
else
{
LinkList k=(LinkList)malloc(sizeof(Link));
k->data=p->data;
k->next=r->next;
r->next=k;
r=k;
p=p->next;
}
}
return 0;
}
int ds(LinkList &A,LinkList &B,LinkList &C)
{
LinkList p=A->next,q=B->next,r=C;
while(p)
{
q=B->next;
while(q)
{
if(p->data==q->data)
break;
else
q=q->next;
}
if(!q)
{
LinkList k=(LinkList)malloc(sizeof(Link));
k->data=p->data;
k->next=r->next;
r->next=k;
r=k;
}
p=p->next;
}
return 0;}
3.测试与分析