C语言集合运算

C语言集合运算

集合运算[用结构类型表示集合] (50 分)
如下给出的结构类型用来表示一个有关正整数的集合类型,结构类型中的每个成员与集合中的相关要素的关联关系已经在注释中说明。

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}

源码下载

链接:https://pan.baidu.com/s/18VnGenF-E31ZcVWboEiC8w?pwd=1111
提取码:1111

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值