以顺序表表示集合,编制一个能演示执行集合的并、交、差、补运算的程序(用c
时间: 2024-09-24 07:03:01 浏览: 73
在C语言中,我们可以创建一个简单的结构体表示元素,并使用数组作为顺序表来存储数据。下面是一个简单的例子,演示如何实现集合的并集、交集、差集和补集操作。首先,我们定义一个结构体`Element`:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int value;
struct Element *next;
} Element;
Element* create_element(int val) {
Element* new_elem = (Element*)malloc(sizeof(Element));
if (new_elem) {
new_elem->value = val;
new_elem->next = NULL;
}
return new_elem;
}
void insert_to_list(Element** list, int val) {
Element* new_elem = create_element(val);
if (*list == NULL) {
*list = new_elem;
} else {
Element* current = *list;
while (current->next != NULL) {
current = current->next;
}
current->next = new_elem;
}
}
```
接下来,我们可以实现并集、交集、差集和补集函数:
```c
// 并集操作
Element* union_of_lists(Element* list1, Element* list2) {
Element* result = list1;
while (list2 != NULL) {
if (result->value > list2->value) {
result->next = list2;
list2 = list2->next;
} else {
result = result->next;
}
}
return list1;
}
// 交集操作
Element* intersection_of_lists(Element* list1, Element* list2) {
Element* result = NULL;
for (Element* elem = list1; elem != NULL; elem = elem->next) {
if (elem->value == list2->value && (result == NULL || result->value < elem->value)) {
result = elem;
}
}
return result ? result : NULL;
}
// 差集操作
Element* difference_of_lists(Element* list1, Element* list2) {
Element* result = NULL;
for (Element* elem = list1; elem != NULL; elem = elem->next) {
if (elem->value != list2->value) {
result = insert_to_list(&result, elem->value);
}
}
return result;
}
// 补集操作,这里假设list1是主集合,补集即除list1外的所有元素
Element* complement_of_list(Element* list1, Element* all_elements) {
Element* diff_list = difference_of_lists(list1, all_elements);
return diff_list;
}
int main() {
// 初始化两个列表
Element* list1 = NULL;
insert_to_list(&list1, 1);
insert_to_list(&list1, 2);
insert_to_list(&list1, 3);
Element* list2 = NULL;
insert_to_list(&list2, 2);
insert_to_list(&list2, 4);
insert_to_list(&list2, 5);
// 打印并集、交集、差集和补集结果
Element* union_result = union_of_lists(list1, list2);
Element* intersec_result = intersection_of_lists(list1, list2);
Element* diff_result = difference_of_lists(list1, list2);
Element* comp_result = complement_of_list(list1, &all_elements); // 假设all_elements包含所有可能的值
printf("Union: ");
print_list(union_result);
printf("\nIntersection: ");
print_list(intersec_result);
printf("\nDifference: ");
print_list(diff_result);
printf("\nComplement of list1: ");
print_list(comp_result);
free(union_result);
free(intersec_result);
free(diff_result);
free(comp_result);
return 0;
}
// 辅助函数,打印链表
void print_list(Element* list) {
while (list != NULL) {
printf("%d ", list->value);
list = list->next;
}
printf("\n");
}
// 假设all_elements初始化了整个集合
Element* all_elements = NULL;
```
这个示例展示了如何使用顺序表实现基本的集合运算。请注意,这只是一个基础版本,实际应用中可能需要处理更复杂的情况,例如动态管理列表节点等。同时,由于内存管理,记得清理不再使用的`Element`指针。
阅读全文