霓虹繁华 2022-02-25 14:14 采纳率: 100%
浏览 206
已结题

请教一下这个pta实验怎么做,集合运算[用结构类型表示集合]

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

struct Set
{
    int MaxSize;           //记录集合中最大元素数
    int Size;              //记录集合中实际元素数
    int *site;             //指向集合存储空间的指针
};
typedef struct Set Set;    //为集合类型声明了一个别名Set


本题要求用这个类型来编写一系列的函数来实现集合的交、并、相对补以及对称差运算。

说明:
为集合分配存储空间,给集合中输入元素、输出集合中元素的相关函数已经编写好,与测试裁判程序一道给出,这些函数无需编写,直接使用即可。检测一个元素是否在集合中的函数也已经编写好了,亦无需定义。请详细阅读测试裁判程序中的相关函数。

函数接口定义:

Set Union(Set A,Set B);                      //求AB
Set Intersection(Set A,Set B);              //求AB
Set Complement(Set A,Set B);                //求A-B
Set SymmetricDifference(Set A,Set B);       //求AB  


其中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}


  • 写回答

3条回答 默认 最新

  • 关注

    给你写了一个交集的,就是遍历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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月5日
  • 已采纳回答 2月25日
  • 创建了问题 2月25日

悬赏问题

  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了