运用c语言链表编制一个能演示执行集合的并、交和差运算的程序。
时间: 2024-04-29 19:26:02 浏览: 15
好的,我可以为您解答这个问题。
以下是一个使用 C 语言链表实现集合并、交和差的示例程序:
```c
#include <stdio.h>
#include <stdlib.h>
/* 定义链表节点 */
struct node {
int data;
struct node *next;
};
/* 创建新节点 */
struct node *create_node(int data) {
struct node *new_node = (struct node *)malloc(sizeof(struct node));
if (new_node == NULL) {
printf("内存分配失败!\n");
exit(1);
}
new_node->data = data;
new_node->next = NULL;
return new_node;
}
/* 插入节点到链表尾部 */
void insert_node(struct node **head, int data) {
struct node *new_node = create_node(data);
if (*head == NULL) {
*head = new_node;
} else {
struct node *cur = *head;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = new_node;
}
}
/* 判断节点是否在集合中 */
int contains_node(struct node *head, int data) {
struct node *cur = head;
while (cur != NULL) {
if (cur->data == data) {
return 1;
}
cur = cur->next;
}
return 0;
}
/* 打印链表数据 */
void print_list(struct node *head) {
struct node *cur = head;
while (cur != NULL) {
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
/* 求集合并 */
struct node *set_union(struct node *head1, struct node *head2) {
struct node *result = NULL;
struct node *cur1 = head1;
struct node *cur2 = head2;
while (cur1 != NULL) {
insert_node(&result, cur1->data);
cur1 = cur1->next;
}
while (cur2 != NULL) {
if (!contains_node(result, cur2->data)) {
insert_node(&result, cur2->data);
}
cur2 = cur2->next;
}
return result;
}
/* 求集合交 */
struct node *set_intersection(struct node *head1, struct node *head2) {
struct node *result = NULL;
struct node *cur1 = head1;
while (cur1 != NULL) {
if (contains_node(head2, cur1->data)) {
insert_node(&result, cur1->data);
}
cur1 = cur1->next;
}
return result;
}
/* 求集合差 */
struct node *set_difference(struct node *head1, struct node *head2) {
struct node *result = NULL;
struct node *cur1 = head1;
while (cur1 != NULL) {
if (!contains_node(head2, cur1->data)) {
insert_node(&result, cur1->data);
}
cur1 = cur1->next;
}
return result;
}
/* 主函数 */
int main() {
struct node *set1 = NULL, *set2 = NULL, *result = NULL;
int data, i, n;
/* 输入第一个集合 */
printf("请输入第一个集合的元素个数:");
scanf("%d", &n);
printf("请输入第一个集合的元素:");
for (i = 0; i < n; ++i) {
scanf("%d", &data);
insert_node(&set1, data);
}
printf("第一个集合为:");
print_list(set1);
/* 输入第二个集合 */
printf("请输入第二个集合的元素个数:");
scanf("%d", &n);
printf("请输入第二个集合的元素:");
for (i = 0; i < n; ++i) {
scanf("%d", &data);
insert_node(&set2, data);
}
printf("第二个集合为:");
print_list(set2);
/* 求集合并 */
result = set_union(set1, set2);
printf("集合并为:");
print_list(result);
/* 求集合交 */
result = set_intersection(set1, set2);
printf("集合交为:");
print_list(result);
/* 求集合差 */
result = set_difference(set1, set2);
printf("第一个集合与第二个集合的差为:");
print_list(result);
return 0;
}
```
希望以上代码对您有帮助。