编写数据结构c语言代码求两个集合的交集和并集的运算。要求: (1)采用数据结构知识实现,不用系统自带的集合类。(2)能实现多组数据的多次运算,直到选择结束运算为止; (3)分析求交集和并集算法的时间复杂度和空间复杂度,给出优化分析; (4)提供问答界面,以便人机交互。
时间: 2024-02-15 11:05:16 浏览: 105
好的,以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int length;
} Set;
// 初始化集合
void init(Set *s) {
s->length = 0;
}
// 添加元素到集合
void add(Set *s, int num) {
s->data[s->length++] = num;
}
// 检查元素是否在集合中
int contains(Set *s, int num) {
for (int i = 0; i < s->length; i++) {
if (s->data[i] == num) {
return 1;
}
}
return 0;
}
// 求交集
Set intersection(Set *s1, Set *s2) {
Set result;
init(&result);
for (int i = 0; i < s1->length; i++) {
if (contains(s2, s1->data[i])) {
add(&result, s1->data[i]);
}
}
return result;
}
// 求并集
Set unionSet(Set *s1, Set *s2) {
Set result;
init(&result);
for (int i = 0; i < s1->length; i++) {
add(&result, s1->data[i]);
}
for (int i = 0; i < s2->length; i++) {
if (!contains(&result, s2->data[i])) {
add(&result, s2->data[i]);
}
}
return result;
}
// 打印集合
void printSet(Set *s) {
printf("{ ");
for (int i = 0; i < s->length; i++) {
printf("%d ", s->data[i]);
}
printf("}\n");
}
int main() {
Set s1, s2, result;
int choice;
init(&s1);
init(&s2);
while (1) {
printf("请选择操作:\n");
printf("1. 添加元素到集合1\n");
printf("2. 添加元素到集合2\n");
printf("3. 求两个集合的交集\n");
printf("4. 求两个集合的并集\n");
printf("5. 退出程序\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要添加的元素:\n");
int num1;
scanf("%d", &num1);
add(&s1, num1);
printf("添加成功!\n");
break;
case 2:
printf("请输入要添加的元素:\n");
int num2;
scanf("%d", &num2);
add(&s2, num2);
printf("添加成功!\n");
break;
case 3:
result = intersection(&s1, &s2);
printf("集合1和集合2的交集为:");
printSet(&result);
break;
case 4:
result = unionSet(&s1, &s2);
printf("集合1和集合2的并集为:");
printSet(&result);
break;
case 5:
printf("程序已退出。\n");
exit(0);
default:
printf("无效输入,请重新输入。\n");
break;
}
}
return 0;
}
```
该程序采用了数组作为数据结构,通过 add 函数来添加元素到集合中,contains 函数来检查元素是否在集合中,intersection 函数来求两个集合的交集,unionSet 函数来求两个集合的并集,printSet 函数来打印集合。
对于时间复杂度,添加元素到集合的时间复杂度为 O(1),求交集和并集的时间复杂度为 O(n^2),其中 n 为集合的元素个数。对于空间复杂度,集合的大小最大为 MAX_SIZE,因此空间复杂度为 O(MAX_SIZE)。
为了优化时间复杂度,可以使用哈希表来实现集合,从而将 contains 函数的时间复杂度降为 O(1),求交集和并集的时间复杂度降为 O(n)。但是这样会增加空间复杂度,因为哈希表需要额外的空间来存储。
阅读全文