c语言完成下列任务:编写函数计算两个整数集合的交集和并集。
时间: 2024-10-28 12:10:24 浏览: 16
在C语言中,我们可以使用标准库函数`<stdio.h>`、`<stdlib.h>`以及自定义函数来完成这个任务。首先,我们需要创建两个函数,一个用于计算交集,另一个用于计算并集。
1. 计算交集的函数:
```c
#include <stdio.h>
#include <stdlib.h>
// 函数声明
typedef struct {
int *arr;
int size;
} IntSet;
IntSet intersect(IntSet set1, IntSet set2) {
IntSet result = { .arr = NULL, .size = 0 };
// 如果其中一个集合为空,则直接返回空集合
if (set1.size == 0 || set2.size == 0)
return result;
// 创建临时数组存储结果,并初始化为set1的第一个元素
result.arr = (int*)malloc(sizeof(int) * set1.size);
result.size = 0;
int* p1 = set1.arr;
int* p2 = set2.arr;
while (*p1 != -1 && *p2 != -1) {
if (*p1 == *p2) {
result.size++;
result.arr[result.size - 1] = *p1;
p1++;
p2++;
} else if (*p1 < *p2) {
p1++;
} else {
p2++;
}
}
// 清理内存和结束
free(set1.arr);
set1.arr = NULL;
set1.size = 0;
return result;
}
void print_set(IntSet set) {
printf("[");
for (int i = 0; i < set.size; i++) {
printf("%d ", set.arr[i]);
}
printf("]\n");
}
```
2. 计算并集的函数:
```c
IntSet union_set(IntSet set1, IntSet set2) {
IntSet result = { .arr = NULL, .size = 0 };
// 按照set1添加元素
if (set1.size > set2.size) {
result.size = set1.size;
result.arr = (int*)realloc(set1.arr, sizeof(int) * result.size);
memcpy(result.arr, set1.arr, sizeof(int) * result.size);
} else {
result.size = set2.size;
result.arr = (int*)malloc(sizeof(int) * result.size);
memcpy(result.arr, set2.arr, sizeof(int) * result.size);
}
// 添加set2中set1没有的元素
int* p1 = set1.arr;
int* p2 = set2.arr + set1.size;
while (*p2 != -1) {
result.size++;
result.arr[result.size - 1] = *p2;
p2++;
}
// 清理旧数据
free(set1.arr);
set1.arr = NULL;
set1.size = 0;
return result;
}
// 示例整数集合表示法,每个元素后跟一个-1作为分隔符
void create_int_set(IntSet* set, ...) {
va_list args;
va_start(args, set);
int num;
*set = (IntSet){ .arr = NULL, .size = 0 };
while ((num = va_arg(args, int)) != -1) {
(*set).size++;
(*set).arr = realloc((*set).arr, sizeof(int) * (*set).size);
(*set).arr[(*set).size - 1] = num;
}
va_end(args);
}
int main() {
IntSet set1 = { .arr = {1, 2, 3, 4}, .size = 4 };
IntSet set2 = { .arr = {3, 4, 5, 6}, .size = 4 };
create_int_set(&set1, 7, -1); // 示例:添加额外的元素到set1
create_int_set(&set2, 8, 9, -1); // 示例:添加额外的元素到set2
IntSet intersection = intersect(set1, set2);
IntSet unionResult = union_set(set1, set2);
print_set(intersection);
print_set(unionResult);
free(intersection.arr);
free(unionResult.arr);
return 0;
}
```
阅读全文