实现两个集合的基本操作,创建集合,输出集合中的元素,判断是不是在一个集合中,求两个集合的交集,并集,差集

本文介绍了一种基于正整数的集合抽象数据类型的实现方法,包括创建集合、输出元素、判断元素是否存在以及集合间的并集、差集和交集等基本运算。通过顺序存储结构实现了这些功能,并提供了完整的源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述一个集合的抽象数据类型为ASet,其中所有的元素都为正整数
基本的运算为:
  由整数数组a[0..n-1]创建一个数组
  输出一个集合的所有元素
  判断一个元素是否在集合中
  求两个集合的并集
  求两个集合的差集
  求两个集合的交集

在此基础上设计集合的顺序存储结构,并实现各基本算法

ADT ASet

{

数据对象:D={di | 0<=i<=n;n为一个正整数}

数据关系:无

基本运算:

CreateSet(&S,a,n);//创建一个集合S
DispSet(S);//输出集合S中的所有元素
InSet(S,e);//判断e是否在S中,如果在,则返回true,否则返回false
Add(s1,s2,s3);//求两个集合的并集
Sub(s1,s2,s4);//求两个集合的差集
InterSection(s1,s2,s5);//求两个集合的交集

}

设计集合的顺序存储结构类型如下:

typedef struct
{
	int data[MAXSIZE];
	int length;        //定义的集合的长度
}Set;                  //集合的别名为Set

源代码为:

#include<stdio.h>
void CreateSet();
void DispSet();
bool InSet();
void Add();
void Sub();
void InterSection();
typedef struct
{
	int data[100];
	int length;        //定义的集合的长度
}Set;                  //集合的别名为Set

void CreateSet(Set &s,int a[],int n)//创建一个集合
{
	int i;
	for(i=0;i<n;i++)                 //遍历a[]中的数据插入到data[]中
	{
		s.data[i]=a[i];
	}

	s.length=n;						 //长度等于n
}


void DispSet(Set s)                  //打印这个集合
{
	int i;
	for(i=0;i<s.length;i++)          //i<这个表的长度时,遍历这个表,一次打印
	{
		printf("%d",s.data[i]);
	}
	printf("\n");                    //最后一行换行
}

bool InSet(Set s,int e)              //判断一个元素在不在这个集合中,如果在,则返回true,否则返回false
{
	int i;
	for(i=0;i<s.length;i++)
	{
		if(s.data[i]==e)
			return true;
	}
	return false;
}

void Add(Set s1,Set s2,Set &s3)     //求集合的并集
{
	int i;
	for (i=0;i<s1.length;i++)       //将集合s1中的元素全部复制到s3中去
	{
		s3.data[i]=s1.data[i];
	}
	s3.length=s1.length;
	for (i=0;i<s2.length;i++)        //将s2中不在s1中的元素复制到s3中去
	{
		if(!InSet(s1,s2.data[i]))
		{
			s3.data[s3.length]=s2.data[i];
			s3.length++;
		}
	}	
}

void Sub(Set s1,Set s2,Set &s4)     //求集合的差集
{
	int i;
	s4.length=0;
	for(i=0;i<s1.length;i++)        //将s1中不在s2中的元素复制到s4中去
	{
		if(!InSet(s2,s1.data[i]))
		{
			s4.data[s4.length]=s1.data[i];
			s4.length++;
		}
	}

}


void InterSection(Set s1,Set s2,Set &s5)  //求两个集合的交集
{
	int i;
	s5.length=0;
	for(i=0;i<s1.length;i++)        //将s1中不在s2中的元素复制到s4中去
	{
		if(InSet(s2,s1.data[i]))
		{
			s5.data[s5.length]=s1.data[i];
			s5.length++;
		}
	}
}
void main()
{
	Set s1,s2,s3,s4,s5;
	int a[]={1,2,3,4,5};
	int b[]={2,3,4,5,6,7,8};
	int n=5,m=7;
	CreateSet(s1,a,n);
	CreateSet(s2,b,m);
	printf("s1:");DispSet(s1);
	printf("s2:");DispSet(s2);
	printf("s1和s2的并集为:");
	Add(s1,s2,s3);                //s1,s2,s3的并集s3
	DispSet(s3);                  //打印并集s3
	printf("s1和s2的差集s4为");
	Sub(s1,s2,s4);
	DispSet(s4); 
	printf("s1和s2的差集s4为");
	InterSection(s1,s2,s5);
	DispSet(s5); 
	return ;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值