用c语言 编制一个能演示执行集合的交、并和差运算的程序。 【任务要求】 1)集合元素用小写英文字母,执行各种操作应以对话方式执行。 算法要点:利用单链表表示集合;有增删功能,对话用中文表示
时间: 2024-05-01 17:16:10 浏览: 40
好的,下面是代码实现。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义集合元素结构体
typedef struct Element {
char data;
struct Element *next;
} Element;
// 定义集合结构体
typedef struct Set {
Element *head;
int size;
} Set;
// 初始化集合
void initSet(Set *set) {
set->head = NULL;
set->size = 0;
}
// 添加元素
void addElement(Set *set, char data) {
// 如果元素已存在,则不添加
if (contains(set, data)) {
return;
}
// 创建新元素并添加到集合头部
Element *newElement = (Element *)malloc(sizeof(Element));
newElement->data = data;
newElement->next = set->head;
set->head = newElement;
set->size++;
}
// 删除元素
void removeElement(Set *set, char data) {
Element *prevElement = NULL;
Element *element = set->head;
// 查找元素并记录前一个元素
while (element != NULL && element->data != data) {
prevElement = element;
element = element->next;
}
// 如果元素不存在,则不删除
if (element == NULL) {
return;
}
// 如果元素是第一个元素,则更新头指针
if (prevElement == NULL) {
set->head = element->next;
} else {
prevElement->next = element->next;
}
// 释放内存并更新集合大小
free(element);
set->size--;
}
// 判断元素是否存在
int contains(Set *set, char data) {
Element *element = set->head;
while (element != NULL) {
if (element->data == data) {
return 1;
}
element = element->next;
}
return 0;
}
// 打印集合中的元素
void printSet(Set *set) {
printf("{ ");
Element *element = set->head;
while (element != NULL) {
printf("%c ", element->data);
element = element->next;
}
printf("}\n");
}
// 求交集
void intersection(Set *set1, Set *set2, Set *result) {
Element *element = set1->head;
// 遍历集合1中的元素,如果同时存在于集合2中,则添加到结果集合中
while (element != NULL) {
if (contains(set2, element->data)) {
addElement(result, element->data);
}
element = element->next;
}
}
// 求并集
void unionSet(Set *set1, Set *set2, Set *result) {
Element *element = set1->head;
// 先添加集合1中的所有元素到结果集合中
while (element != NULL) {
addElement(result, element->data);
element = element->next;
}
// 再添加集合2中的所有元素到结果集合中
element = set2->head;
while (element != NULL) {
addElement(result, element->data);
element = element->next;
}
}
// 求差集
void difference(Set *set1, Set *set2, Set *result) {
Element *element = set1->head;
// 遍历集合1中的元素,如果不同时存在于集合2中,则添加到结果集合中
while (element != NULL) {
if (!contains(set2, element->data)) {
addElement(result, element->data);
}
element = element->next;
}
}
int main() {
Set set1, set2, result;
char command[10], data;
initSet(&set1);
initSet(&set2);
initSet(&result);
printf("请输入操作命令:\n");
while (scanf("%s", command) != EOF) {
if (strcmp(command, "add1") == 0) { // 添加元素到集合1
scanf(" %c", &data);
addElement(&set1, data);
printf("集合1中添加元素%c成功!\n", data);
} else if (strcmp(command, "add2") == 0) { // 添加元素到集合2
scanf(" %c", &data);
addElement(&set2, data);
printf("集合2中添加元素%c成功!\n", data);
} else if (strcmp(command, "remove1") == 0) { // 从集合1中删除元素
scanf(" %c", &data);
removeElement(&set1, data);
printf("集合1中删除元素%c成功!\n", data);
} else if (strcmp(command, "remove2") == 0) { // 从集合2中删除元素
scanf(" %c", &data);
removeElement(&set2, data);
printf("集合2中删除元素%c成功!\n", data);
} else if (strcmp(command, "contains1") == 0) { // 判断集合1中是否存在元素
scanf(" %c", &data);
if (contains(&set1, data)) {
printf("集合1中存在元素%c!\n", data);
} else {
printf("集合1中不存在元素%c!\n", data);
}
} else if (strcmp(command, "contains2") == 0) { // 判断集合2中是否存在元素
scanf(" %c", &data);
if (contains(&set2, data)) {
printf("集合2中存在元素%c!\n", data);
} else {
printf("集合2中不存在元素%c!\n", data);
}
} else if (strcmp(command, "print1") == 0) { // 打印集合1中的元素
printf("集合1中的元素为:");
printSet(&set1);
} else if (strcmp(command, "print2") == 0) { // 打印集合2中的元素
printf("集合2中的元素为:");
printSet(&set2);
} else if (strcmp(command, "intersection") == 0) { // 求交集
intersection(&set1, &set2, &result);
printf("集合1和集合2的交集为:");
printSet(&result);
} else if (strcmp(command, "union") == 0) { // 求并集
unionSet(&set1, &set2, &result);
printf("集合1和集合2的并集为:");
printSet(&result);
} else if (strcmp(command, "difference") == 0) { // 求差集
difference(&set1, &set2, &result);
printf("集合1和集合2的差集为:");
printSet(&result);
} else {
printf("无效的命令!\n");
}
printf("请输入操作命令:\n");
}
return 0;
}
```
运行程序后,可以通过输入不同的命令来执行相应的操作。
例如,输入`add1 a`表示向集合1中添加元素`a`;输入`remove2 b`表示从集合2中删除元素`b`;输入`print1`表示打印集合1中的元素;输入`intersection`表示求集合1和集合2的交集等等。
阅读全文