用C语言 编制一个能演示执行集合的交、并和差运算的程序。 【任务要求】 1)集合元素用大小写英文字母、数组、汉字、拼音,执行各种操作应以对话方式执行。 2)算法要点:利用单链表表示集合
时间: 2024-02-03 19:03:02 浏览: 68
集合的并、交和差运算的算法.docx
好的,我可以帮你解决这个问题。
下面是一个基本的单链表结构体:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 单链表结构体
typedef struct node {
char data[20];
struct node *next;
}node;
```
接下来,我们可以定义一些基本的操作函数,如创建集合、添加元素、删除元素、判断集合是否为空、查找元素是否在集合中等。
```c
// 创建集合
node *createSet() {
node *new_node = (node *)malloc(sizeof(node));
if (new_node == NULL) {
printf("内存分配失败!\n");
exit(1);
}
new_node->next = NULL;
return new_node;
}
// 添加元素
void addElement(node *set, char *data) {
node *new_node = (node *)malloc(sizeof(node));
if (new_node == NULL) {
printf("内存分配失败!\n");
exit(1);
}
strcpy(new_node->data, data);
new_node->next = set->next;
set->next = new_node;
}
// 删除元素
void deleteElement(node *set, char *data) {
node *p = set->next;
node *prev = set;
while (p != NULL && strcmp(p->data, data) != 0) {
prev = p;
p = p->next;
}
if (p != NULL) {
prev->next = p->next;
free(p);
}
}
// 判断集合是否为空
int isEmpty(node *set) {
return set->next == NULL;
}
// 查找元素是否在集合中
int findElement(node *set, char *data) {
node *p = set->next;
while (p != NULL && strcmp(p->data, data) != 0) {
p = p->next;
}
return p != NULL;
}
```
接下来,我们可以定义集合的交、并、差运算函数,以对话方式执行。
```c
// 集合的交运算
void intersection(node *set1, node *set2) {
node *p = set1->next;
while (p != NULL) {
if (!findElement(set2, p->data)) {
deleteElement(set1, p->data);
}
p = p->next;
}
printf("交运算完成!\n");
}
// 集合的并运算
void unionSet(node *set1, node *set2) {
node *p = set2->next;
while (p != NULL) {
if (!findElement(set1, p->data)) {
addElement(set1, p->data);
}
p = p->next;
}
printf("并运算完成!\n");
}
// 集合的差运算
void difference(node *set1, node *set2) {
node *p = set2->next;
while (p != NULL) {
if (findElement(set1, p->data)) {
deleteElement(set1, p->data);
}
p = p->next;
}
printf("差运算完成!\n");
}
```
最后,我们可以编写主函数,以对话方式执行各种操作。
```c
int main() {
node *set1 = createSet();
node *set2 = createSet();
char data[20];
int choice;
while (1) {
printf("请选择操作:\n");
printf("1. 添加元素\n");
printf("2. 删除元素\n");
printf("3. 判断集合是否为空\n");
printf("4. 查找元素是否在集合中\n");
printf("5. 集合的交运算\n");
printf("6. 集合的并运算\n");
printf("7. 集合的差运算\n");
printf("0. 退出\n");
printf("请输入选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要添加的元素:");
scanf("%s", data);
addElement(set1, data);
break;
case 2:
printf("请输入要删除的元素:");
scanf("%s", data);
deleteElement(set1, data);
break;
case 3:
if (isEmpty(set1)) {
printf("集合为空!\n");
} else {
printf("集合不为空!\n");
}
break;
case 4:
printf("请输入要查找的元素:");
scanf("%s", data);
if (findElement(set1, data)) {
printf("元素 %s 在集合中!\n", data);
} else {
printf("元素 %s 不在集合中!\n", data);
}
break;
case 5:
intersection(set1, set2);
break;
case 6:
printf("请输入第二个集合的元素:\n");
while (1) {
printf("请输入要添加的元素(输入0结束):");
scanf("%s", data);
if (strcmp(data, "0") == 0) {
break;
}
addElement(set2, data);
}
unionSet(set1, set2);
break;
case 7:
printf("请输入第二个集合的元素:\n");
while (1) {
printf("请输入要添加的元素(输入0结束):");
scanf("%s", data);
if (strcmp(data, "0") == 0) {
break;
}
addElement(set2, data);
}
difference(set1, set2);
break;
case 0:
printf("程序结束!\n");
return 0;
default:
printf("输入有误,请重新输入!\n");
break;
}
}
return 0;
}
```
以上就是一个能演示执行集合的交、并和差运算的程序,希望能够帮助到你。
阅读全文