代码如下:
#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;
}