C语言。编制一个能演示执行集合的交、并和差运算的程序。 【任务要求] 1)集合元素用小写英文字母,执行各种操作应以对话方式执行。 2) 算法要点:利用单链表表示集合;理解好三种运算的含义
时间: 2023-07-14 08:13:36 浏览: 189
集合的并交补差
好的,下面是一个简单的C语言程序,用单链表来表示集合,并可以执行集合的交、并和差运算。运行程序后,您可以通过对话方式输入集合操作指令,程序将输出相应的结果。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 100 // 集合最大元素数量
/* 定义单链表结构体 */
typedef struct List {
char data;
struct List *next;
} List;
/* 创建一个新节点 */
List *create_node(char data) {
List *node = (List *) malloc(sizeof(List));
node->data = data;
node->next = NULL;
return node;
}
/* 在链表尾部插入一个节点 */
void insert_node(List **head, char data) {
List *node = create_node(data);
if (*head == NULL) {
*head = node;
} else {
List *p = *head;
while (p->next != NULL) {
p = p->next;
}
p->next = node;
}
}
/* 从链表中删除一个节点 */
void delete_node(List **head, char data) {
if (*head == NULL) {
return;
}
List *p = *head;
if (p->data == data) {
*head = (*head)->next;
free(p);
return;
}
while (p->next != NULL && p->next->data != data) {
p = p->next;
}
if (p->next != NULL) {
List *q = p->next;
p->next = q->next;
free(q);
}
}
/* 求两个集合的交集 */
List *intersection(List *set1, List *set2) {
List *result = NULL;
while (set1 != NULL && set2 != NULL) {
if (set1->data < set2->data) {
set1 = set1->next;
} else if (set1->data > set2->data) {
set2 = set2->next;
} else {
insert_node(&result, set1->data);
set1 = set1->next;
set2 = set2->next;
}
}
return result;
}
/* 求两个集合的并集 */
List *union_set(List *set1, List *set2) {
List *result = NULL;
while (set1 != NULL && set2 != NULL) {
if (set1->data < set2->data) {
insert_node(&result, set1->data);
set1 = set1->next;
} else if (set1->data > set2->data) {
insert_node(&result, set2->data);
set2 = set2->next;
} else {
insert_node(&result, set1->data);
set1 = set1->next;
set2 = set2->next;
}
}
while (set1 != NULL) {
insert_node(&result, set1->data);
set1 = set1->next;
}
while (set2 != NULL) {
insert_node(&result, set2->data);
set2 = set2->next;
}
return result;
}
/* 求两个集合的差集 */
List *difference(List *set1, List *set2) {
List *result = NULL;
while (set1 != NULL && set2 != NULL) {
if (set1->data < set2->data) {
insert_node(&result, set1->data);
set1 = set1->next;
} else if (set1->data > set2->data) {
set2 = set2->next;
} else {
set1 = set1->next;
set2 = set2->next;
}
}
while (set1 != NULL) {
insert_node(&result, set1->data);
set1 = set1->next;
}
return result;
}
/* 输出集合 */
void print_set(List *head) {
printf("{");
while (head != NULL) {
printf("%c", head->data);
head = head->next;
if (head != NULL) {
printf(",");
}
}
printf("}\n");
}
int main() {
List *set1 = NULL, *set2 = NULL;
char input[MAX_LEN];
while (1) {
printf("请输入集合元素,以空格分隔(例如:a b c):\n");
fgets(input, MAX_LEN, stdin);
char *token = strtok(input, " ");
while (token != NULL) {
insert_node(&set1, token[0]);
token = strtok(NULL, " ");
}
printf("第一个集合为:");
print_set(set1);
printf("请输入集合元素,以空格分隔(例如:a b c):\n");
fgets(input, MAX_LEN, stdin);
token = strtok(input, " ");
while (token != NULL) {
insert_node(&set2, token[0]);
token = strtok(NULL, " ");
}
printf("第二个集合为:");
print_set(set2);
printf("请选择集合操作:\n");
printf("1.交集 2.并集 3.差集\n");
int choice;
scanf("%d", &choice);
getchar(); // 消耗掉多余的回车符
switch (choice) {
case 1:
printf("两个集合的交集为:");
print_set(intersection(set1, set2));
break;
case 2:
printf("两个集合的并集为:");
print_set(union_set(set1, set2));
break;
case 3:
printf("第一个集合减去第二个集合的差集为:");
print_set(difference(set1, set2));
printf("第二个集合减去第一个集合的差集为:");
print_set(difference(set2, set1));
break;
default:
printf("无效的输入!\n");
break;
}
/* 清空集合 */
while (set1 != NULL) {
List *p = set1;
set1 = set1->next;
free(p);
}
while (set2 != NULL) {
List *p = set2;
set2 = set2->next;
free(p);
}
set1 = NULL;
set2 = NULL;
printf("是否继续?(y/n)\n");
char yn[2];
fgets(yn, 2, stdin);
if (yn[0] != 'y') {
break;
}
}
return 0;
}
```
运行程序后,您可以按照提示输入集合元素和操作指令,例如:
```
请输入集合元素,以空格分隔(例如:a b c):
a b c d
第一个集合为:{a,b,c,d}
请输入集合元素,以空格分隔(例如:a b c):
c d e f
第二个集合为:{c,d,e,f}
请选择集合操作:
1.交集 2.并集 3.差集
2
两个集合的并集为:{a,b,c,d,e,f}
是否继续?(y/n)
y
请输入集合元素,以空格分隔(例如:a b c):
a b c d
第一个集合为:{a,b,c,d}
请输入集合元素,以空格分隔(例如:a b c):
c d e f
第二个集合为:{c,d,e,f}
请选择集合操作:
1.交集 2.并集 3.差集
1
两个集合的交集为:{c,d}
是否继续?(y/n)
n
```
阅读全文