C语言求集合的交并差源代码
时间: 2024-09-30 10:07:17 浏览: 38
C语言程序设计入门源代码代码集合.doc
在C语言中,为了实现集合的交集、并集和差集操作,你可以使用标准库函数`<stdbool.h>`中的布尔类型`bool`以及自定义的数据结构如数组或链表来存储元素。这里提供一个简单的示例,假设我们使用整数作为集合元素,并用数组表示:
```c
#include <stdbool.h>
#include <stdio.h>
typedef struct {
int* elements;
size_t count;
} Set;
// 添加元素到集合
void add_to_set(Set* set, int element) {
if (set->count == set->elements capacity) {
// 如果已满,需要扩容
set->elements = realloc(set->elements, 2 * set->count * sizeof(int));
}
set->elements[set->count++] = element;
}
// 检查元素是否存在于集合中
bool is_in_set(const Set* set, int element) {
for (size_t i = 0; i < set->count; i++) {
if (set->elements[i] == element)
return true;
}
return false;
}
// 计算两个集合的交集
Set* intersection(Set* set1, Set* set2) {
Set result;
result.elements = malloc(sizeof(int) * 0); // 初始容量为0
result.count = 0;
for (int i = 0; i < set1->count && i < set2->count; i++) {
if (is_in_set(set2, set1->elements[i])) { // 元素只在set2中存在
add_to_set(&result, set1->elements[i]);
}
}
return &result;
}
// 计算两个集合的并集
Set* union_set(Set* set1, Set* set2) {
Set result;
result.elements = malloc(sizeof(int) * (set1->count + set2->count)); // 使用最大容量
result.count = 0;
for (int i = 0; i < set1->count; i++) {
add_to_set(&result, set1->elements[i]);
}
for (int i = 0; i < set2->count; i++) {
if (!is_in_set(&result, set2->elements[i])) {
add_to_set(&result, set2->elements[i]);
}
}
return &result;
}
// 计算两个集合的差集(set1减去set2)
Set* difference(Set* set1, Set* set2) {
Set result;
result.elements = malloc(sizeof(int) * set1->count); // 保留set1的原始大小
result.count = 0;
for (int i = 0; i < set1->count; i++) {
if (!is_in_set(set2, set1->elements[i]))
add_to_set(&result, set1->elements[i]);
}
return &result;
}
// 释放内存
void free_set(Set* set) {
free(set->elements);
free(set);
}
// 测试代码
int main() {
// 初始化集合...
// 示例:Set set1, set2;
// ...
// 使用上述函数计算交集、并集和差集...
Set* intersect = intersection(&set1, &set2);
Set* union_set = union_set(&set1, &set2);
Set* diff = difference(&set1, &set2);
// 打印结果
printf("Intersection: ");
print_set(intersect);
printf("\nUnion: ");
print_set(union_set);
printf("\nDifference: ");
print_set(diff);
// 清理内存
free_set(intersect);
free_set(union_set);
free_set(diff);
return 0;
}
// 辅助函数打印集合
void print_set(const Set* set) {
for (size_t i = 0; i < set->count; i++)
printf("%d ", set->elements[i]);
printf("\n");
}
```
这个示例是一个基础版本,实际应用中可能需要处理更多细节,比如更复杂的数据结构、错误检查等。记住在使用完后记得清理内存。
阅读全文