如下给出的结构类型用来表示一个有关正整数的集合类型,结构类型中的每个成员与集合中的相关要素的关联关系已经在注释中说明。
struct Set
{
int MaxSize; //记录集合中最大元素数
int Size; //记录集合中实际元素数
int *site; //指向集合存储空间的指针
};
typedef struct Set Set; //为集合类型声明了一个别名Set
本题要求用这个类型来编写一系列的函数来实现集合的交、并、相对补以及对称差运算。
说明:
为集合分配存储空间,给集合中输入元素、输出集合中元素的相关函数已经编写好,与测试裁判程序一道给出,这些函数无需编写,直接使用即可。检测一个元素是否在集合中的函数也已经编写好了,亦无需定义。请详细阅读测试裁判程序中的相关函数。
函数接口定义:
Set Union(Set A,Set B); //求A∪B
Set Intersection(Set A,Set B); //求A∩B
Set Complement(Set A,Set B); //求A-B
Set SymmetricDifference(Set A,Set B); //求A⊕B
其中A 和 B 都是用户传入的参数,其类型均为用上述定义的Set型集合。函数的返回值均为Set 类型的集合。
裁判测试程序样例:
#include"stdio.h"
#include"stdlib.h"
struct Set
{
int MaxSize; //记录集合中最大元素数
int Size; //记录集合中实际元素数
int *site; //指向集合存储空间的指针
};
typedef struct Set Set; //为集合类型声明了一个别名Set
/****************以下函数为输出一个集合的函数*************/
void display(Set S)
{
printf("{");
for(int i=0;i<S.Size;i++)
if(i==0)printf("%d",S.site[i]);
else printf(",%d",S.site[i]);
printf("}\n");
}
/****************以下函数创建集合的存储空间*************/
Set CreatSet(int maxSize)
{
Set S;
S.Size=0; //集合的实际元素数置0
S.MaxSize=maxSize; //集合最大元素数为maxSize;
S.site=(int*)malloc(maxSize*sizeof(int));
return S;
}
/****以下函数判断x是否在集合A中 *****/
int IsIn(int x,Set S)
{
int i;
for(i=0;i<S.Size;i++)
{
if(x==S.site[i])
return 1;
}
return 0;
}
/***************以下函数为集合S输入元素**************
输入的元素均为非0正整数,若输入0则认为输入结束
****************************************************/
void InputSet(Set *S)
{
int a=0;
do
{
scanf("%d",&a);
if(!IsIn(a,*S)&&a>0) //检验集合元素的互异性
S->site[S->Size++]=a;
}while(a>0&&S->Size<S->MaxSize);
}
/* 你编写和几个函数将嵌入在这里 */
int main(){
Set A,B,C;//声明集合类型的变量A、B、C
int num;
scanf("%d",&num); //为集合A输入最大元素数
A=CreatSet(num); //为集合A创建存储空间
InputSet(&A); //给集合A输入元素
scanf("%d",&num); //为集合B输入最大元素数
B=CreatSet(num); //为集合B创建存储空间
InputSet(&B); //给集合B输入元素
C=Union(A,B); //将A、B的并存入C
printf("A∪B=");display(C);
C=Intersection(A,B);//将A、B的交存入C
printf("A∩B=");display(C);
C=Complement(A,B);//将A、B的相对补存入C
printf("A-B=");display(C);
C=SymmetricDifference(A,B);//将A、B的对称差存入C
printf("A⊕B=");display(C);
return 0;
}
输入说明及输入样例:
输入分两行进行,第一行为第一个集合中的相关数据,第二行为第二个集合中的相关数据。每行第一个数字为该集合中的存储空间的大小(即最大元素数),紧接着的若干个非零正整数为集合中的元素值,最后一个数0为数据输入结束标志。
10 1 2 3 4 5 3 6 0
10 1 2 9 8 4 6 2 0
输出样例:
输出分四行,第一行输出并集,第二行输出交集,第三行输出相对补集合,第四行输出对称差集合。如果某个集合是空集,则在相应的表达式后输出{}。
A∪B={1,2,3,4,5,6,8,9}
A∩B={1,2,4,6}
A-B={3,5}
A⊕B={3,5,8,9}
给你写了一个交集的,就是遍历A B 共同的放到一个集合里,其他几个同理
如有帮助,请击【采纳该答案】按钮支持一下,谢谢!以后有什么问题可以互相交流。
Set Intersection(Set A,Set B)
{
Set S=CreatSet(1000);
int i,j;
for(i=0; i<A.Size; i++)
{
for(j=0; j<B.Size; j++)
if(A.site[i]==B.site[j])
S.site[S.Size++]=A.site[i];
}
return S;
}
Set Union(Set A,Set B)
{
int i,j,f=1;
Set S=CreatSet(1000);
for(i=0; i<A.Size; i++)
{f=0;
for(j=0; j<S.Size; j++){
if(A.site[i]==S.site[j]){
f=1;break;
}
}
if(f==0)S.site[S.Size++]=A.site[i];
}
for(i=B.Size-1; i>=0; i--){
f=0;
for(j=0; j<S.Size; j++){
if(B.site[i]==S.site[j]){
f=1;break;
}
}if(f==0)S.site[S.Size++]=B.site[i];
}
return S;
}
Set Complement(Set A,Set B){
int i,j,f=0;
Set S=CreatSet(1000);
for(i=0; i<A.Size; i++){
f=0;
for(j=0; j<B.Size; j++){
if(A.site[i]!=B.site[j]){
f++;
}
}
if(f==B.Size)
S.site[S.Size++]=A.site[i];
}
return S;
}
/* 你编写和几个函数将嵌入在这里 */
Set SymmetricDifference(Set A,Set B){
int i,j,f=0;
Set S=CreatSet(1000);
for(i=0; i<A.Size; i++){
f=0;
for(j=0; j<B.Size; j++){
if(A.site[i]!=B.site[j]){
f++;
}
}
if(f==B.Size)
S.site[S.Size++]=A.site[i];
}
for(i=B.Size-1; i>=0; i--){
f=0;
for(j=A.Size-1; j>=0; j--){
if(B.site[i]!=A.site[j]){
f++;
}
}
if(f==B.Size)
S.site[S.Size++]=B.site[i];
}
return S;
}
Set paixu(Set C)
{
int i,j,nb;
for(i=0;i<C.Size;i++)
for(j=i;j<C.Size;j++)
{
if(C.site[i]>C.site[j])
{
nb=C.site[i];
C.site[i]=C.site[j];
C.site[j]=nb;
}
}
return C;
}
Set Union(Set A,Set B) //求A∪B
{
Set C=CreatSet(100);
int i,k=0;
for(i=0;i<A.Size;i++)
{
C.site[k]=A.site[i];
k++;
}
for(i=0;i<B.Size;i++)
{
if(!IsIn(B.site[i],A))
{
C.site[k]=B.site[i];
k++;
}
}
C.Size=k;
C=paixu(C);
return C;
}
Set Intersection(Set A,Set B) //求A∩B
{
Set C=CreatSet(100);
int i,k=0;
for(i=0;i<A.Size;i++)
if(IsIn(A.site[i],B))
{
C.site[k]=A.site[i];
k++;
}
C.Size=k;
C=paixu(C);
return C;
}
Set Complement(Set A,Set B) //求A-B
{
Set C=CreatSet(100);
int i,j,nb,k=0;
for(i=0;i<A.Size;i++)
if(!IsIn(A.site[i],B))
{
C.site[k]=A.site[i];
k++;
}
C.Size=k;
C=paixu(C);
return C;
}
Set SymmetricDifference(Set A,Set B) //求A⊕B
{
Set a=CreatSet(A.MaxSize),b=CreatSet(B.MaxSize),C=CreatSet(100);
int i,j;
a=Complement(A,B);
b=Complement(B,A);
C.Size=a.Size+b.Size;
for(i=0;i<a.Size;i++)
C.site[i]=a.site[i];
for(i=a.Size,j=0;i<C.Size;i++,j++)
C.site[i]=b.site[j];
C=paixu(C);
return C;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!