用c语言编制一个能演示执行集合的交、并和差运算的程序。 【任务要求】 1)集合元素用小写英文字母,执行各种操作应以对话方式执行。 2)算法要点:利用单链表表示集合;
时间: 2024-05-16 10:16:09 浏览: 15
好的,以下是一个简单的用单链表表示集合并实现交、并、差运算的程序。请注意,本程序并不考虑输入错误和非法操作的情况。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义链表节点
typedef struct Node {
char value;
struct Node *next;
} Node;
// 打印集合
void printSet(Node *head) {
printf("{");
Node *p = head->next;
while (p) {
printf("%c", p->value);
if (p->next) {
printf(", ");
}
p = p->next;
}
printf("}\n");
}
// 判断元素是否在集合中
int isInSet(Node *head, char value) {
Node *p = head->next;
while (p) {
if (p->value == value) {
return 1;
}
p = p->next;
}
return 0;
}
// 向集合中添加元素
void addToSet(Node *head, char value) {
if (!isInSet(head, value)) {
Node *newNode = malloc(sizeof(Node));
newNode->value = value;
newNode->next = head->next;
head->next = newNode;
}
}
// 从集合中删除元素
void removeFromSet(Node *head, char value) {
Node *p = head;
while (p->next) {
if (p->next->value == value) {
Node *temp = p->next;
p->next = temp->next;
free(temp);
return;
}
p = p->next;
}
}
// 求两个集合的交集
Node *intersection(Node *set1, Node *set2) {
Node *result = malloc(sizeof(Node));
result->next = NULL;
Node *p = set1->next;
while (p) {
if (isInSet(set2, p->value)) {
addToSet(result, p->value);
}
p = p->next;
}
return result;
}
// 求两个集合的并集
Node *unionSet(Node *set1, Node *set2) {
Node *result = malloc(sizeof(Node));
result->next = NULL;
Node *p = set1->next;
while (p) {
addToSet(result, p->value);
p = p->next;
}
p = set2->next;
while (p) {
addToSet(result, p->value);
p = p->next;
}
return result;
}
// 求两个集合的差集
Node *difference(Node *set1, Node *set2) {
Node *result = malloc(sizeof(Node));
result->next = NULL;
Node *p = set1->next;
while (p) {
if (!isInSet(set2, p->value)) {
addToSet(result, p->value);
}
p = p->next;
}
return result;
}
int main() {
Node *set1 = malloc(sizeof(Node));
set1->next = NULL;
Node *set2 = malloc(sizeof(Node));
set2->next = NULL;
printf("请输入第一个集合(以逗号分隔,回车结束):");
char input[100];
fgets(input, 100, stdin);
int len = strlen(input);
for (int i = 0; i < len; i++) {
if (input[i] >= 'a' && input[i] <= 'z') {
addToSet(set1, input[i]);
}
}
printf("第一个集合为:");
printSet(set1);
printf("请输入第二个集合(以逗号分隔,回车结束):");
fgets(input, 100, stdin);
len = strlen(input);
for (int i = 0; i < len; i++) {
if (input[i] >= 'a' && input[i] <= 'z') {
addToSet(set2, input[i]);
}
}
printf("第二个集合为:");
printSet(set2);
printf("请输入操作(输入 q 退出程序):\n");
while (1) {
printf("1. 求交集\n2. 求并集\n3. 求差集\n");
char op[10];
fgets(op, 10, stdin);
if (op[0] == 'q') {
break;
}
switch (op[0]) {
case '1':
printf("交集为:");
printSet(intersection(set1, set2));
break;
case '2':
printf("并集为:");
printSet(unionSet(set1, set2));
break;
case '3':
printf("差集为:");
printSet(difference(set1, set2));
break;
default:
printf("无效操作,请重新输入。\n");
break;
}
}
// 释放链表内存
Node *p = set1->next;
while (p) {
Node *temp = p;
p = p->next;
free(temp);
}
free(set1);
p = set2->next;
while (p) {
Node *temp = p;
p = p->next;
free(temp);
}
free(set2);
return 0;
}
```
运行程序后,根据提示输入两个集合,然后输入要执行的操作即可。例如:
```
请输入第一个集合(以逗号分隔,回车结束):a,b,c,d
第一个集合为:{a, b, c, d}
请输入第二个集合(以逗号分隔,回车结束):b,d,e,f
第二个集合为:{b, d, e, f}
请输入操作(输入 q 退出程序):
1. 求交集
2. 求并集
3. 求差集
1
交集为:{b, d}
请输入操作(输入 q 退出程序):
1. 求交集
2. 求并集
3. 求差集
2
并集为:{a, b, c, d, e, f}
请输入操作(输入 q 退出程序):
1. 求交集
2. 求并集
3. 求差集
3
差集为:{a, c}
请输入操作(输入 q 退出程序):
1. 求交集
2. 求并集
3. 求差集
q
```