每日一题:C语言例题之不简单的整数集合数据结构

代码如下:

#include <stdio.h>

// 定义一个 Set 结构体,用于表示整数集合
typedef struct
{
    // 使用固定大小的数组 data 存储集合中的元素
    int data[MaxSize]; // 假设 MaxSize 已在其他地方定义
    // length 用来记录集合中实际存储的元素个数
    int length;
}Set;

// 函数 cset:将整数数组 a 中的前 n 个元素复制到 Set 类型变量 s 中,并设置 s 的长度为 n
void cset(Set& s, int a[], int n)
{
    for(int i = 0; i < n; i++)
        // 将数组 a 中的元素赋值给集合 s
        s.data[i] = a[i];
    // 设置集合 s 的长度为传入的参数 n
    s.length = n;
}

// 函数 dispset:打印 Set 类型变量 s 中的所有元素
void dispset(Set s)
{
    for(int i = 0; i < s.length; i++)
        printf("%d ", s.data[i]); // 打印每个元素
    printf("\n"); // 换行
}

// 函数 inset:检查元素 e 是否在 Set 类型变量 s 中,若存在则返回 1,否则返回 0
int inset(Set s, int e)
{
    for(int i = 0; i < s.length; i++)
        // 如果找到了元素 e,则返回 1 表示存在
        if(s.data[i] == e)
            return 1;
    // 循环结束未找到元素 e,则返回 0 表示不存在
    return 0;
}

// 函数 add:计算并集,将 s1 和 s2 的并集存储在 s3 中
void add(Set s1, Set s2, Set &s3)
{
    int i;
    
    // 首先将 s1 的所有元素复制到 s3
    for (i = 0; i < s1.length; i++)
        s3.data[i] = s1.data[i];
    s3.length = s1.length;
    
    // 然后遍历 s2,将不在 s1 中的元素添加到 s3
    for (i = 0; i < s2.length; i++)
        if (!inset(s1, s2.data[i]))
        { 
            s3.data[s3.length] = s2.data[i];
            s3.length++; // 并集元素个数增加
        }
}

// 函数 sub:计算差集,将 s1 和 s2 的差集存储在 s3 中(即属于 s1 但不属于 s2 的元素)
void sub(Set s1, Set s2, Set &s3)
{
    s3.length = 0;
    // 遍历 s1,将不在 s2 中的元素添加到 s3
    for (int i = 0; i < s1.length; i++)
        if (!inset(s2, s1.data[i]))
        { 
            s3.data[s3.length] = s1.data[i];
            s3.length++; // 差集元素个数增加
        }
}

// 函数 intersection:计算交集,将 s1 和 s2 的交集存储在 s3 中
void intersection(Set s1, Set s2, Set &s3)
{ 
    s3.length = 0;
    // 遍历 s1,如果元素存在于 s2 中,则将其添加到 s3
    for (int i = 0; i < s1.length; i++)
        if (inset(s2, s1.data[i]))
        { 
            s3.data[s3.length] = s1.data[i];
            s3.length++; // 交集元素个数增加
        }
}

int main()
{
    int a[] = {1, 4, 2, 6, 8};
    int b[] = {2, 5, 3, 6};
    Set s1, s2, s3;

    // 初始化集合 s1 和 s2
    cset(s1, a, 5);
    cset(s2, b, 4);

    // 打印和操作两个集合
    printf("集合 s1: ");
    dispset(s1);
    printf("集合 s2: ");
    dispset(s2);

    // 计算并集并打印结果
    add(s1, s2, s3);
    printf("集合 s1 和 s2 的并集: ");
    dispset(s3);

    // 计算差集并打印结果
    sub(s1, s2, s3);
    printf("集合 s1 和 s2 的差集: ");
    dispset(s3);

    // 计算交集并打印结果
    intersection(s1, s2, s3);
    printf("集合 s1 和 s2 的交集: ");
    dispset(s3);

    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值