采用顺序表结构编程实现:两个集合的运算:交集 并集 差集
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define OVERFLOW -2
#define ERROR 0
using namespace std;
typedef struct
{
int *elem;
int length;
int listsize;
} SqList;
int InitList_Sq(SqList &L)
{
L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
int ListInsert_Sq(SqList &L,int i,int e)
{
if(i<1||i>L.length+1)
return ERROR;
if(L.length>=L.listsize)
{
int *newbase;
newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
int *p,*q;
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]); p>=q; p--)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}
int GetElem(SqList L,int i,int &e)
//用e返回L中第i个元素的值
{
if(i<1||i>L.length)
return ERROR;
e=L.elem[i-1];
return OK;
}
int equal_e(int a,int b)
{
if(a==b)
return OK;
else
return ERROR;
}
int LocateElem(SqList L,int e,int (*compare)(int ,int))
//在表中查找第一个值与e满足compare()元素的位序
{
int i=1;
int *p=L.elem;
while(i<=L.length&&!(*compare)(*p++,e))
++i;
if(i<=L.length)
return i;
else
return 0;
}
void Get(SqList L)
//输出当前列表
{
//cout<<"当前列表:"<<endl;
for(int i=0; i<L.length; i++)
{
cout<<L.elem[i]<<" ";
}
cout<<endl;
}
void union_set(SqList La,SqList Lb,SqList &Lc)
//a与b的并集放入c中
{
int La_len=La.length;
int Lb_len=Lb.length;
int e;
for(int i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,e);
if(!LocateElem(La,e,equal_e))
ListInsert_Sq(La,++La_len,e);
}
//cout<<"La_len:"<<La_len<<endl;
//cout<<"La.leng:"<<La.length<<endl;
//cout<<"输出a:"<<endl;Get(La);
for(int i=1;i<=La_len;i++)
{
GetElem(La,i,e);
ListInsert_Sq(Lc,i,e);
}
}
int mixture(SqList La,SqList Lb,SqList &Lc)
//a与b的交集
{
int La_len=La.length;
int Lb_len=Lb.length;
int e;
int index=0;
//cout<<Lc.length<<endl;
SqList p=La_len<=Lb_len?La:Lb;
SqList q=La_len>Lb_len?La:Lb;
for(int i=1;i<=p.length;i++)
{
GetElem(p,i,e);
if(LocateElem(q,e,equal_e))
{
ListInsert_Sq(Lc,++index,e);
//Get(Lc);
}
}
if(Lc.length)
return OK;
else
return ERROR;
}
int different(SqList La,SqList Lb,SqList &Lc)
//求a-b差集
{
int La_len=La.length;
int e;
int index=0;
for(int i=1;i<=La_len;i++)
{
GetElem(La,i,e);
if(!LocateElem(Lb,e,equal_e))
ListInsert_Sq(Lc,++index,e);
}
if(Lc.length)
return OK;
else
return ERROR;
}
int main()
{
SqList La,Lb;
InitList_Sq(La);
InitList_Sq(Lb);
cout<<"线性表a的长度:"<<endl;
int la;
cin>>la;
cout<<"请输入a中的元素:"<<endl;
int e;
for(int i=1;i<=la;i++)
{
cin>>e;
//cout<<La.length<<endl;
ListInsert_Sq(La,i,e);
}
//Get(La);
cout<<"线性表b的长度:"<<endl;
int lb;
cin>>lb;
cout<<"请输入b中的元素:"<<endl;
for(int i=1;i<=lb;i++)
{
cin>>e;
ListInsert_Sq(Lb,i,e);
}
//Get(Lb);
cout<<"A并B:"<<endl;
SqList Lc1;
InitList_Sq(Lc1);
union_set(La,Lb,Lc1);
Get(Lc1);
cout<<"A交B:"<<endl;
SqList Lc2;
InitList_Sq(Lc2);
if(mixture(La,Lb,Lc2))
Get(Lc2);
else
cout<<"null"<<endl;
cout<<"A-B:"<<endl;
SqList Lc3;
InitList_Sq(Lc3);
if(different(La,Lb,Lc3))
Get(Lc3);
else
cout<<"null"<<endl;
return 0;
}