数据结构课程设计(顺序表的应用—集合运算)附完整源码、word和ppt

本文介绍了如何使用C语言中的顺序表数据结构实现集合操作,包括向集合中添加、查找、删除元素,以及计算交集、并集、补集和差集,并提供了示例代码和测试过程。
摘要由CSDN通过智能技术生成

目录

一、问题描述

二、使用的数据结构

三、代码分析与实现

四、运行与测试

1、向集合里增加元素

2、查找集合里是否存在元素

3、删除集合里的元素

4、集合的交

5、集合的并

6、集合的补

7、集合的差

8、输出结果

9、退出

五、源码链接

链接:


一、问题描述

运用数据结构顺序表来存储集合,结构体中应包含集合的大小、存放集合的数组。通过以数组存储的元素导入到顺序表中存储,形成一个含有元素的集合,并通过一些功能函数和操作函数来实现集合之间的交集、并集、补集和差集运算。

二、使用的数据结构

  1. 数据结构:顺序表、数组
  2. 存储结构:顺序存储

三、代码分析与实现

//初始化顺序表
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

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-凉介-一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值