用c语言编制一个能演示执行集合的交、并和差运算的程序。【任务要求】集合元素用小写英文字母,执行各种操作应以对话方式执行。算法要点:利用单链表表示集合;理解好三种运算的含义
时间: 2024-05-14 15:18:14 浏览: 15
好的,我可以帮你编写这个程序。首先,我们需要定义一个单链表来表示集合。每个节点都存储一个集合元素。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
char data;
struct Node* next;
} Node;
typedef struct Set {
Node* head;
} Set;
```
接下来,我们可以实现创建新节点和向集合中添加元素的函数。
```c
Node* new_node(char data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
return node;
}
void add_element(Set* set, char data) {
Node* node = new_node(data);
node->next = set->head;
set->head = node;
}
```
现在,我们可以实现并集、交集和差集的函数了。这些函数都接收两个集合作为参数,并返回一个新的集合作为结果。
```c
Set* union_set(Set* set1, Set* set2) {
Set* result = (Set*)malloc(sizeof(Set));
result->head = NULL;
Node* curr = set1->head;
while (curr != NULL) {
add_element(result, curr->data);
curr = curr->next;
}
curr = set2->head;
while (curr != NULL) {
if (!contains(result, curr->data)) {
add_element(result, curr->data);
}
curr = curr->next;
}
return result;
}
Set* intersection_set(Set* set1, Set* set2) {
Set* result = (Set*)malloc(sizeof(Set));
result->head = NULL;
Node* curr = set1->head;
while (curr != NULL) {
if (contains(set2, curr->data)) {
add_element(result, curr->data);
}
curr = curr->next;
}
return result;
}
Set* difference_set(Set* set1, Set* set2) {
Set* result = (Set*)malloc(sizeof(Set));
result->head = NULL;
Node* curr = set1->head;
while (curr != NULL) {
if (!contains(set2, curr->data)) {
add_element(result, curr->data);
}
curr = curr->next;
}
return result;
}
```
最后,我们可以编写一个简单的对话程序,让用户输入两个集合和要执行的操作,并输出结果。
```c
int main() {
Set set1, set2;
set1.head = NULL;
set2.head = NULL;
printf("请输入第一个集合(用逗号分隔每个元素):");
char input[100];
fgets(input, 100, stdin);
char* token = strtok(input, ",");
while (token != NULL) {
add_element(&set1, *token);
token = strtok(NULL, ",");
}
printf("请输入第二个集合(用逗号分隔每个元素):");
fgets(input, 100, stdin);
token = strtok(input, ",");
while (token != NULL) {
add_element(&set2, *token);
token = strtok(NULL, ",");
}
printf("请选择要执行的操作(1. 并集,2. 交集,3. 差集):");
int choice;
scanf("%d", &choice);
Set* result;
switch (choice) {
case 1:
result = union_set(&set1, &set2);
printf("结果为:");
print_set(result);
break;
case 2:
result = intersection_set(&set1, &set2);
printf("结果为:");
print_set(result);
break;
case 3:
result = difference_set(&set1, &set2);
printf("结果为:");
print_set(result);
break;
default:
printf("无效的选择\n");
break;
}
return 0;
}
```
完整代码如下: