题目:
描述一个集合的抽象数据类型ASet,其中所有元素为正整数且所有元素不相同,集合的基本运算包括:
(1)由整数组a[0...n-1]创建一个集合
(2)输出一个集合中的所有元素
(3)判断一个元素是否在集合中
(4)求两个集合的并集
(5)求两个集合的差集
(6)求两个集合的交集
在此基础上设计集合的顺序存储结构,并实现各基本运算的算法。
思路:可以采用顺序表的形式来表示集合这一抽象概念
typedef struct
{
int data[MaxSize];
int length;
}Set;
(1)分析:
由于初始为一个整数数组,因此可采用遍历的形式,将数组中的所有元素依次复制到线性表中。
void createset(Set &s,int a[],int n)
{
int i; //定义一个循环变量i
for(i=0;i<n;i++)
s.data[i]=a[i]; //依次遍历数组,从而将数组中的所有元素均复制到线性表中
s.length=n; //定义集合的长度为n
}
(2)分析:
用遍历的形式依次进行输出即可。
void dispset(Set s)
{
int i;
for(i=0;i<s.length;i++)
printf("%d",s.data[i]);
printf("\n");
}
(3)分析:
首先采用i的形式依次遍历数组,然后在其中嵌套一个if语句进行条件判断
bool inset(Set s,int e)
{
int i;
for(i=0;i<s.length;i++) //采用i依次遍历数组
if(s.data[i]==e) return true; //倘若数组中含有该元素,则返回真
return false; //不含有该元素,则返回假
}
(4)分析:
该函数首先将s1中的全部元素复制到s3中,然后在遍历s2的过程中,调用if语句判断s2中的元素是否重复出现于s1中,倘若没有重复出现,则将s2中的元素复制到s3中。
void Bing(Set s1,Set s2,Set &s3)
{
int i; //定义循环变量i在数组中进行遍历
for(i=0;i<s.length;i++) //遍历s1
s3.data[i]=s1.data[i]; //将s1中的数据全部复制到s3中
s3.length=s1.length; //规定s3的长度暂为s1的长度
for(i=0;i<s2.length;i++) //遍历s2
if(!inset(s1,s2.data[i])) //if成立条件为s2中的数组不在s1中出现
{
s3.data[s3.length]=s2.data[i]; //此时将符合条件的元素添加到s3中
s3.length++; //s3的长度自增
}
}
(5)分析:
该运算主要是求仅在s1中而不在s3中的元素,因此需要将s1中所有的元素均进行遍历,然后逐一进行条件判断。
void sub(Set s1,Set s2,Set &s3)
{
int i;
s3.length=0;
for(i=0;i<s1.length;i++)
if(!inset(s2,s1.data[i]))
{
s3.data[s3.length]=s1.[data];
s3.length++;
}
}
(6)分析:
该运算主要是求既在s1也在s2中的元素,但在实际操作时,只需要遍历s1和s2的其中一个数组即可,然后对其中的每个元素均进行条件判断。
void intersection(Set S1,Set S2,Set &S3)
{
int i; //定义循环变量i
s3.length=0; //初始s3.length=0;
for(i=0;i<s1.length;i++) //遍历集合s1
if(inset(s2,s1.data[i])) //倘若s1中的数据也存在于s2中
{
s3.data[s3.length]=s1.data[i]; //将s1中的数据复制到s3中
s3.length++; //s3.length自增
}
}