目录
一、问题描述
运用数据结构顺序表来存储集合,结构体中应包含集合的大小、存放集合的数组。通过以数组存储的元素导入到顺序表中存储,形成一个含有元素的集合,并通过一些功能函数和操作函数来实现集合之间的交集、并集、补集和差集运算。
二、使用的数据结构
- 数据结构:顺序表、数组。
- 存储结构:顺序存储。
三、代码分析与实现
//初始化顺序表
typedef struct { //初始化顺序表
dataType data[MaxSize];
int size;
}SqSet;
//创建一个空的顺序表(集合)
SqSet* CreateSet() //创建一个空的集合
{
SqSet *t = (SqSet*)malloc(sizeof(SqSet));
t->size = 0;
return t;
}
//从数组元素建立集合
SqSet* CreateSetFromArray(dataType a[],int n){ //从数组元素建立集合
int i=0;
SqSet *t=(SqSet*)malloc(sizeof(SqSet));
t->size=n;
for( i=0; i<n; i++) //利用for循环从数组里面向顺序表(集合)里面添加元素
t->data[i] = a[i];
return t;
}
//功能函数
//查找集合中是否存在元素x
int Find(SqSet *s,dataType x)
{
int i;
for (i=0; i<s->size; i++)
if (s->data[i]==x)
return 1;
return 0;}
//往集合中增加元素X
void Add(SqSet *s,dataType x){
if(Find(s,x)) return;
s->data[s->size]=x;
s->size++;}
//删除集合中的元素X
void Delete(SqSet *s,dataType x){
int i;
for(i=0;i<s->size;i++){
if(s->data[i]==x){
s->data[i]=s->data[--s->size];
return;
}
}
}
//输出集合
void Print(SqSet *s){
int i;
if(s->size==0)
printf("该集合为空");
else
for(i=0;i<s->size;i++)
printf("%c ",s->data[i]);
printf("\n");}
//求两个集合的并集
void Union(SqSet *a, SqSet *b, SqSet *c)
{
int i;
for (i=0;i<a->size;i++) //通过for循环把集合a的所有元素传递给
c->data[i]=a->data[i]; 集合c
c->size=a->size;
for(i=0;i<b->size;i++)
if(!Find(c,b->data[i])) //通过以集合c的元素为底,以b集合的元素
c->data[c->size++]=b->data[i]; 为查找元素,一个一个的进行利用find
} 函数进行判断,如果在c里面没有找到
该元素,则将该元素放入集合c中。
//求两个集合的交集
void Intersection(SqSet *a,SqSet *b,SqSet *c)
{ int i;
c->size=0;
for(i=0;i<a->size;i++) //通过以集合b的元素为底,以a集合的元素
if(Find(b,a->data[i])) 为查找元素,一个一个的进行利用find
c->data[c->size++]=a->data[i]; 函数进行判断,如果在b里面找到了
} 该元素,则将该元素放入集合c中。
//求集合的补集
void buji(SqSet *a,SqSet *b,SqSet *c)
{ int i;
c->size=0; //通过以集合b的元素为底,以a(全集u)
for(i=0;i<a->size;i++){ 的元素为查找元素,一个一个的进行利用find
if(!Find(b,a->data[i])) 函数进行判断,如果在b里面没有
c->data[c->size++]=a->data[i]; 该元素,则将该元素放入集合c中。
}
}
//求集合的差集
void chaji(SqSet *a,SqSet *b,SqSet *c)
{ int i;
c->size=0; //通过以集合b的元素为底,以a集合的元素
for(i=0;i<a->size;i++){ 为查找元素,一个一个的进行利用find
if(!Find(b,a->data[i])){ 函数进行判断,如果b中没有该元素
c->data[c->size++]=a->data[i]; 则将该元素放入c集合中。
}
}
}
//界面构建
/********************************************界面**************************************/
void show(){
printf("\t|-------------------------集合运算--------------------------|\n");
printf("\n");
printf("\t|------1.向集合里增加元素--------||------7.集合的差-----------|\n");
printf("\t|------2.查找集合里是否存在元素--||------8.输出结果-----------|\n");
printf("\t|------3.删除集合里的元素--------||------9.退出------------ --|\n");
printf("\t|------4.集合的交----------------||---------------------------|\n");
printf("\t|------5.集合的并----------------||---------------------------|\n");
printf("\t|------6.集合的补----------------||---------------------------|\n");
printf("\n");
printf("\t|-----------------------------------------------------------|\n");
printf("\n");
}
//主函数和用户交互命令
//初始定义
int main(){
int choice; //定义初始数组A,B和U。
dataType A[]={'a','b','c','d'};
dataType B[]={'a','d','e','f','w','r'};
dataType U[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
SqSet *s1, *s2, *s3, *s4, *s5, *s6, *s61, *s7, *s71, *s8;
s1=CreateSetFromArray(A,4); //以数组A、B和U的数据建立
s2=CreateSetFromArray(B,6); 集合A、B和全 集U
s3=CreateSetFromArray(U,26);
s4=CreateSet(); //建立多个空集合用于存储集合运算后的结果
s5=CreateSet();
s6=CreateSet();
s61=CreateSet();
s71=CreateSet();
s7=CreateSet();
s8=CreateSet();
//While函数实现程序循环
while(1){
show(); //调用界面显示
printf("(初始集合元素)\n"); //初始集合元素显示
printf("A集合元素为:");
Print(s1);
printf("B集合元素为:");
Print(s2);
printf("全集U为:");
Print(s3);
printf("请输入你需要进行的操作\n");
scanf("%d",&choice);
//使用switch函数实现用户进行选择交互
if(choice==9){
printf("感谢你使用本系统!\n");
printf("已退出。");
return 0;
}
else{
switch(choice){
case 1:
char w;
int s;
printf("请选择你要进行操作的集合:1.A集合,2.B集合\n");
scanf("%d",&s);
getchar();
if(s==1){
printf("请输入你需要添加的元素:");
scanf("%c",&w);
Add(s1,w);
Print(s1);
}
else if(s==2){
printf("请输入你需要添加的元素:");
scanf("%c",&w);
Add(s2,w);
Print(s2);
}
else{
printf("你的输入有误!");
}
getchar();
printf("请按回车键继续!\n");
getchar();
system("cls");
break;
case 2:
char o;
int a,n;
printf("请选择你要进行操作的集合:1.A集合,2.B集合\n");
scanf("%d",&a);
getchar();
if(a==1){
printf("请输入你需要查找的元素:");
scanf("%c",&o);
n=Find(s1,o);
if(n==1)
printf("A集合内存在%c元素。",o);
else
printf("A集合内不存在%c元素。",o);
}
else if(a==2){
printf("请输入你需要查找的元素:");
scanf("%c",&o);
n=Find(s1,o);
if(n==1)
printf("B集合内存在%c元素。",o);
else
printf("B集合内不存在%c元素。",o);
}
else{
printf("你的输入有误!");
}
getchar();
printf("请按回车键继续!\n");
getchar();
system("cls");
break;
case 3:
char m;
int t;
printf("请选择你要进行操作的集合:1.A集合,2.B集合\n");
scanf("%d",&t);
getchar();
if(t==1){
printf("请输入你需要删除的元素:");
scanf("%c",&m);
Delete(s1,m);
Print(s1);
}
else if(t==2){
printf("请输入你需要删除的元素:");
scanf("%c",&m);
Delete(s2,m);
Print(s2);
}
else{
printf("你的输入有误!");
}
getchar();
printf("请按回车键继续!\n");
getchar();
system("cls");
break;
case 4:
printf("A和B的交集为:");
Intersection(s1,s2,s4);
Print(s4);
getchar();
printf("请按回车键继续!\n");
getchar();
system("cls");
break;
case 5:
printf("A和B的并集为:");
Union(s1,s2,s5);
Print(s5);
getchar();
printf("请按回车键继续!\n");
getchar();
system("cls");
break;
case 6:
int l;
printf("请选择你要进行操作的集合:1.A集合,2.B集合\n");
scanf("%d",&l);
getchar();
if(l==1){
printf("A集合的补集为:");
buji(s3,s1,s6);
Print(s6);
}
else if(l==2){
printf("B集合的补集为:");
buji(s3,s2,s61);
Print(s61);
}
else{
printf("你的输入有误!");
}
printf("请按回车键继续!\n");
getchar();
system("cls");
break;
case 7:
int v;
printf("请选择你要进行操作的集合:1.A-B,2.B-A\n");
scanf("%d",&v);
getchar();
if(v==1){
printf("A-B=");
chaji(s1,s2,s7);
Print(s7);
}
else if(v==2){
printf("B-A=");
chaji(s2,s1,s71);
Print(s71);
}
else{
printf("你的输入有误!");
}
printf("请按回车键继续!\n");
getchar();
system("cls");
break;
case 8:
printf("A集合为:");
Print(s1);
printf("B集合为:");
Print(s2);
printf("全集U为:");
Print(s3);
if(s4->size==0){
printf("你没有进行两集合交集运算!\n");
}
else{
printf("两集合交集为:");
shuchu(s4);
}
if(s5->size==0){
printf("你没有进行两集合并集运算!\n");
}
else{
printf("两集合并集为:");
shuchu(s5);
}
if(s6->size==0){
printf("你没有进行A的补集运算!\n");
}
else{
printf("A的补集为:");
shuchu(s6);
}
if(s61->size==0){
printf("你没有进行B的补集运算!\n");
}
else{
printf("B的补集为:");
shuchu(s61);
}
if(s7->size==0){
printf("你没有进行集合A-B的运算!\n");
}
else{
printf("A-B=");
shuchu(s7);
}
if(s71->size==0){
printf("你没有进行集合B-A的运算!\n");
}
else{
printf("B-A=");
shuchu(s71);
}
getchar();
printf("请按回车键继续!\n");
getchar();
system("cls");
break;
}
}
}
}
四、运行与测试
1、向集合里增加元素
2、查找集合里是否存在元素
3、删除集合里的元素
4、集合的交
5、集合的并
6、集合的补
7、集合的差
8、输出结果
9、退出
五、源码链接
链接:
https://download.csdn.net/download/m0_56068773/88805759?spm=1001.2014.3001.5501