用c语言编制一个能演示执行集合的交、并和差运算的程序。合元素用小写英文字母,执行各种操作应以对话方式执行。算法要点:利用单链表表示集合;理解好三种运算的含义
时间: 2024-05-14 18:18:22 浏览: 116
好的,我可以为您编写一个基于单链表的集合运算程序,以下是代码和相应的注释说明:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/* 定义集合元素结构体 */
typedef struct element {
char data; // 元素数据
struct element *next; // 指向下一个元素的指针
} Element;
/* 定义集合结构体 */
typedef struct set {
Element *head; // 指向头结点的指针
int size; // 集合元素个数
} Set;
/* 函数声明 */
Set* createSet(); // 创建集合
void destroySet(Set *set); // 销毁集合
void addElement(Set *set, char data); // 添加元素到集合中
void removeElement(Set *set, char data);// 从集合中删除元素
void printSet(Set *set); // 打印集合
Set* unionSet(Set *set1, Set *set2); // 求两个集合的并集
Set* intersectSet(Set *set1, Set *set2);// 求两个集合的交集
Set* diffSet(Set *set1, Set *set2); // 求两个集合的差集
/* 主函数 */
int main()
{
Set *set1 = createSet(); // 创建集合1
Set *set2 = createSet(); // 创建集合2
Set *set3 = NULL; // 用于存储计算结果的集合
char input;
while (1) {
printf("请输入一个指令(a:添加元素,d:删除元素,u:求并集,i:求交集,s:求差集,q:退出):");
input = tolower(getchar()); // 获取输入的指令,并转换为小写字母
if (input == 'a') { // 添加元素
printf("请输入要添加的元素:");
char data = getchar(); // 获取输入的元素数据
getchar(); // 清除输入缓冲区中的回车符
addElement(set1, data); // 将元素添加到集合1中
printf("集合1中的元素为:");
printSet(set1); // 打印集合1中的元素
}
else if (input == 'd') { // 删除元素
printf("请输入要删除的元素:");
char data = getchar(); // 获取输入的元素数据
getchar(); // 清除输入缓冲区中的回车符
removeElement(set1, data); // 从集合1中删除元素
printf("集合1中的元素为:");
printSet(set1); // 打印集合1中的元素
}
else if (input == 'u') { // 求并集
set3 = unionSet(set1, set2);// 计算集合1和集合2的并集
printf("集合1和集合2的并集为:");
printSet(set3); // 打印计算结果
destroySet(set3); // 销毁集合3,释放内存
}
else if (input == 'i') { // 求交集
set3 = intersectSet(set1, set2);// 计算集合1和集合2的交集
printf("集合1和集合2的交集为:");
printSet(set3); // 打印计算结果
destroySet(set3); // 销毁集合3,释放内存
}
else if (input == 's') { // 求差集
set3 = diffSet(set1, set2); // 计算集合1和集合2的差集
printf("集合1和集合2的差集为:");
printSet(set3); // 打印计算结果
destroySet(set3); // 销毁集合3,释放内存
}
else if (input == 'q') { // 退出程序
break;
}
else { // 输入指令错误
printf("无效的指令,请重新输入!\n");
}
}
destroySet(set1); // 销毁集合1,释放内存
destroySet(set2); // 销毁集合2,释放内存
return 0;
}
/* 创建集合 */
Set* createSet()
{
Set *set = (Set*)malloc(sizeof(Set)); // 分配内存空间
set->head = NULL; // 头结点为空
set->size = 0; // 初始元素个数为0
return set;
}
/* 销毁集合 */
void destroySet(Set *set)
{
Element *p = set->head;
while (p != NULL) { // 释放链表中所有结点的内存
Element *q = p;
p = p->next;
free(q);
}
free(set); // 释放集合结构体本身的内存
}
/* 添加元素到集合中 */
void addElement(Set *set, char data)
{
Element *p = set->head;
while (p != NULL) { // 遍历集合中的元素
if (p->data == data) { // 元素已经存在,不需要添加
return;
}
p = p->next;
}
Element *newElement = (Element*)malloc(sizeof(Element)); // 分配内存空间
newElement->data = data; // 设置新元素的数据
newElement->next = set->head; // 新元素的next指向当前头结点
set->head = newElement; // 当前头结点更新为新元素
set->size++; // 集合元素个数加1
}
/* 从集合中删除元素 */
void removeElement(Set *set, char data)
{
Element *p = set->head;
Element *pre = NULL;
while (p != NULL) { // 遍历集合中的元素
if (p->data == data) { // 找到要删除的元素
if (pre == NULL) { // 要删除的元素是头结点
set->head = p->next; // 当前头结点更新为要删除元素的下一个结点
}
else { // 要删除的元素不是头结点
pre->next = p->next; // 直接将前一个元素的next指向要删除元素的下一个结点
}
free(p); // 释放要删除元素的内存
set->size--; // 集合元素个数减1
return;
}
pre = p;
p = p->next;
}
}
/* 打印集合 */
void printSet(Set *set)
{
Element *p = set->head;
printf("{");
while (p != NULL) { // 遍历集合中的元素
printf("%c", p->data); // 打印元素的数据
p = p->next;
if (p != NULL) {
printf(",");
}
}
printf("}\n");
}
/* 求两个集合的并集 */
Set* unionSet(Set *set1, Set *set2)
{
Set *set3 = createSet(); // 创建新集合
Element *p = set1->head;
while (p != NULL) { // 遍历集合1中的元素
addElement(set3, p->data);// 将元素添加到新集合中
p = p->next;
}
p = set2->head;
while (p != NULL) { // 遍历集合2中的元素
addElement(set3, p->data);// 将元素添加到新集合中
p = p->next;
}
return set3;
}
/* 求两个集合的交集 */
Set* intersectSet(Set *set1, Set *set2)
{
Set *set3 = createSet(); // 创建新集合
Element *p = set1->head;
while (p != NULL) { // 遍历集合1中的元素
Element *q = set2->head;
while (q != NULL) { // 遍历集合2中的元素
if (p->data == q->data) {// 如果两个元素相等
addElement(set3, p->data);// 将元素添加到新集合中
break;
}
q = q->next;
}
p = p->next;
}
return set3;
}
/* 求两个集合的差集 */
Set* diffSet(Set *set1, Set *set2)
{
Set *set3 = createSet(); // 创建新集合
Element *p = set1->head;
while (p != NULL) { // 遍历集合1中的元素
Element *q = set2->head;
while (q != NULL) { // 遍历集合2中的元素
if (p->data == q->data) {// 如果两个元素相等
break;
}
q = q->next;
}
if (q == NULL) { // 如果集合2中没有该元素
addElement(set3, p->data);// 将元素添加到新集合中
}
p = p->next;
}
return set3;
}
```
该程序提供了以下功能:
1. 添加元素到集合中
2. 从集合中删除元素
3. 求两个集合的并集
4. 求两个集合的交集
5. 求两个集合的差集
您可以在程序运行时通过输入指令来执行这些功能。其中,元素用小写英文字母表示,每个元素之间用逗号隔开,集合用大括号括起来表示。例如,集合{a,b,c}表示由元素a、b、c组成的集合。
希望这个程序能够帮助您理解集合的基本操作。
阅读全文