C语言顺序表实现集合运算:并集、交集、差集、补集
C语言顺序表实现集合运算:并集、交集、差集、补集
简介
本文介绍如何使用 C 语言的顺序表实现集合的运算,包括:
- 构造集合* 求并集* 求交集* 求差集* 求补集
代码实现c#include <stdio.h>#include <stdbool.h>#include <stdlib.h>
#define MAX_SIZE 26
typedef struct { char data[MAX_SIZE]; int length;} SeqList;
// 初始化顺序表void init(SeqList *list) { list->length = 0;}
// 在顺序表中查找元素位置int find(SeqList *list, char element) { for (int i = 0; i < list->length; i++) { if (list->data[i] == element) { return i; } } return -1;}
// 向顺序表中添加元素void add(SeqList *list, char element) { if (list->length == MAX_SIZE) { printf('顺序表已满,无法添加元素! '); return; } list->data[list->length++] = element;}
// 从顺序表中删除指定位置的元素void removeElement(SeqList *list, int index) { if (index < 0 || index >= list->length) { printf('非法的索引位置! '); return; } for (int i = index; i < list->length - 1; i++) { list->data[i] = list->data[i + 1]; } list->length--;}
// 构造集合void constructSet(SeqList *list) { char input[MAX_SIZE]; printf('请输入元素集合(以回车结束): '); fgets(input, sizeof(input), stdin); for (int i = 0; input[i] != '�'; i++) { if (input[i] >= 'a' && input[i] <= 'z') { add(list, input[i]); } } printf('集合构造完成! ');}
// 求并集void unionSet(SeqList *list1, SeqList *list2, SeqList *result) { for (int i = 0; i < list1->length; i++) { add(result, list1->data[i]); } for (int i = 0; i < list2->length; i++) { if (find(result, list2->data[i]) == -1) { add(result, list2->data[i]); } }}
// 求交集void intersectSet(SeqList *list1, SeqList *list2, SeqList *result) { for (int i = 0; i < list1->length; i++) { if (find(list2, list1->data[i]) != -1) { add(result, list1->data[i]); } }}
// 求差集void differenceSet(SeqList *list1, SeqList *list2, SeqList *result) { for (int i = 0; i < list1->length; i++) { if (find(list2, list1->data[i]) == -1) { add(result, list1->data[i]); } }}
// 求补集void complementSet(SeqList *list, SeqList *result) { for (char c = 'a'; c <= 'z'; c++) { if (find(list, c) == -1) { add(result, c); } }}
// 打印集合void printSet(SeqList *list) { if (list->length == 0) { printf('集合为空! '); } else { for (int i = 0; i < list->length; i++) { printf('%c ', list->data[i]); } printf(' '); }}
int main() { SeqList set1, set2, resultSet; init(&set1); init(&set2); init(&resultSet);
int choice; while (true) { printf('
请选择操作: '); printf('1. 构造集合1 '); printf('2. 构造集合2 '); printf('3. 求并集 '); printf('4. 求交集 '); printf('5. 求差集 '); printf('6. 求补集 '); printf('7. 退出 '); scanf('%d', &choice);
switch (choice) { case 1: constructSet(&set1); printf('集合1的内容为:'); printSet(&set1); break;
case 2: constructSet(&set2); printf('集合2的内容为:'); printSet(&set2); break;
case 3: unionSet(&set1, &set2, &resultSet); printf('集合1和集合2的并集为:'); printSet(&resultSet); init(&resultSet); break;
case 4: intersectSet(&set1, &set2, &resultSet); printf('集合1和集合2的交集为:'); printSet(&resultSet); init(&resultSet); break;
case 5: differenceSet(&set1, &set2, &resultSet); printf('集合1和集合2的差集为:'); printSet(&resultSet); init(&resultSet); break;
case 6: complementSet(&set1, &resultSet); printf('集合1的补集为:'); printSet(&resultSet); init(&resultSet); break;
case 7: printf('程序已退出!
'); exit(0);
default: printf('非法的选择!
'); break; } }
return 0;}
代码说明
- 该程序使用顺序表
SeqList来表示集合,并定义了相应的操作函数。*constructSet函数用于构造集合,它接收用户输入的字符串,并将其中的小写字母添加到集合中。*unionSet、intersectSet、differenceSet和complementSet函数分别用于求两个集合的并集、交集、差集和补集。*printSet函数用于打印集合的内容。*main函数提供了一个用户界面,允许用户选择不同的操作并输入相应的数据。
总结
本文介绍了如何使用 C 语言的顺序表实现集合的运算,并提供了完整的代码示例。该程序可以帮助用户理解集合的概念和操作,并为实际应用提供参考。
原文地址: https://www.cveoy.top/t/topic/diLR 著作权归作者所有。请勿转载和采集!