集合的运算-并、交、对称差用C语言实现
时间: 2024-11-15 11:27:57 浏览: 25
在C语言中,集合的运算通常涉及到动态数组或者结构体来表示集合。由于C语言的标准库并不直接支持集合运算,我们需要自定义函数来模拟这些操作。下面是一个简单的示例,我们将使用整数数组来代表集合,并实现并集、交集和对称差的操作:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义集合数据结构
typedef struct {
int* elements; // 存储元素的指针
int size; // 集合大小
} Set;
// 动态分配内存初始化集合
Set* create_set(int count) {
Set* set = (Set*)malloc(sizeof(Set));
set->elements = (int*)malloc(count * sizeof(int));
set->size = count;
return set;
}
// 添加元素到集合
void add_element(Set* set, int element) {
if (set->size == set->elements.length) {
set->elements = realloc(set->elements, (set->size + 1) * sizeof(int));
}
set->elements[set->size++] = element;
}
// 合并两个集合(并集)
void union_set(Set* set1, Set* set2) {
for (int i = 0; i < set2->size; ++i) {
add_element(set1, set2->elements[i]);
}
}
// 交集操作
Set* intersect_set(Set* set1, Set* set2) {
Set* result = create_set(0);
for (int i = 0; i < set1->size && i < set2->size; ++i) {
if (set1->elements[i] == set2->elements[i]) {
add_element(result, set1->elements[i]);
}
}
free(set1); // 释放set1的内存
return result;
}
// 对称差(A包含B但不包含C,C包含A但不包含B的元素)
Set* symmetric_difference(Set* set1, Set* set2) {
Set* result = create_set(0);
for (int i = 0; i < set1->size || i < set2->size; ++i) {
int elem;
if (i < set1->size && !find_element_in_set(set2, set1->elements[i])) {
add_element(result, set1->elements[i]);
} else if (i < set2->size && !find_element_in_set(set1, set2->elements[i])) {
add_element(result, set2->elements[i]);
}
}
return result;
}
// 检查元素是否存在于集合中
int find_element_in_set(Set* set, int element) {
for (int i = 0; i < set->size; ++i) {
if (set->elements[i] == element) {
return 1;
}
}
return 0;
}
// 打印集合内容
void print_set(Set* set) {
printf("[");
for (int i = 0; i < set->size; ++i) {
printf("%d ", set->elements[i]);
}
printf("]\n");
}
int main() {
// 创建并操作示例
Set* set1 = create_set(5);
add_element(set1, 1); add_element(set1, 2); add_element(set1, 3);
Set* set2 = create_set(4);
add_element(set2, 2); add_element(set2, 4); add_element(set2, 6);
union_set(set1, set2);
print_set(set1); // 输出 [1 2 3 4 6]
// 交集和对称差示例
Set* intersection = intersect_set(set1, set2);
print_set(intersection); // 输出 [2]
Set* diff = symmetric_difference(set1, set2);
print_set(diff); // 输出 [1 3 4 6]
free(set1);
free(set2);
free(intersection);
free(diff);
return 0;
}
```
这个例子展示了如何通过自定义结构和函数实现并集、交集和对称差。请注意,这只是一个基础版本,实际应用中可能会需要考虑更高效的内存管理和错误处理。
阅读全文