帮我用c语言有序链表写一个集合交并差运算的算法
时间: 2023-12-28 12:05:04 浏览: 95
集合的并交叉三种运算,C语言实现
好的,下面是一个用 C 语言实现有序链表的集合交并差运算的算法:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node;
// 创建一个新节点
Node *new_node(int item) {
Node *p = (Node *) malloc(sizeof(Node));
p->data = item;
p->next = NULL;
return p;
}
// 打印链表
void print_list(Node *head) {
Node *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 向有序链表中插入元素(升序)
Node *insert(Node *head, int item) {
Node *p, *prev, *new_node;
new_node = new_node(item);
if (head == NULL) {
head = new_node;
} else {
p = head;
prev = NULL;
while (p != NULL && p->data < item) {
prev = p;
p = p->next;
}
if (prev == NULL) {
new_node->next = head;
head = new_node;
} else {
new_node->next = prev->next;
prev->next = new_node;
}
}
return head;
}
// 集合交运算
Node *intersect(Node *set1, Node *set2) {
Node *result = NULL;
Node *p = set1, *q = set2;
while (p && q) {
if (p->data == q->data) {
result = insert(result, p->data);
p = p->next;
q = q->next;
} else if (p->data < q->data) {
p = p->next;
} else {
q = q->next;
}
}
return result;
}
// 集合并运算
Node *union_set(Node *set1, Node *set2) {
Node *result = NULL;
Node *p = set1, *q = set2;
while (p && q) {
if (p->data == q->data) {
result = insert(result, p->data);
p = p->next;
q = q->next;
} else if (p->data < q->data) {
result = insert(result, p->data);
p = p->next;
} else {
result = insert(result, q->data);
q = q->next;
}
}
while (p) {
result = insert(result, p->data);
p = p->next;
}
while (q) {
result = insert(result, q->data);
q = q->next;
}
return result;
}
// 集合差运算
Node *diff_set(Node *set1, Node *set2) {
Node *result = NULL;
Node *p = set1, *q = set2;
while (p && q) {
if (p->data == q->data) {
p = p->next;
q = q->next;
} else if (p->data < q->data) {
result = insert(result, p->data);
p = p->next;
} else {
q = q->next;
}
}
while (p) {
result = insert(result, p->data);
p = p->next;
}
return result;
}
int main() {
Node *set1 = NULL, *set2 = NULL, *result = NULL;
int n, m, i, x;
printf("请输入集合1的元素个数:");
scanf("%d", &n);
printf("请输入集合1的%d个元素:", n);
for (i = 0; i < n; i++) {
scanf("%d", &x);
set1 = insert(set1, x);
}
printf("请输入集合2的元素个数:");
scanf("%d", &m);
printf("请输入集合2的%d个元素:", m);
for (i = 0; i < m; i++) {
scanf("%d", &x);
set2 = insert(set2, x);
}
printf("集合1的元素:");
print_list(set1);
printf("集合2的元素:");
print_list(set2);
result = intersect(set1, set2);
printf("集合1和集合2的交集:");
print_list(result);
result = union_set(set1, set2);
printf("集合1和集合2的并集:");
print_list(result);
result = diff_set(set1, set2);
printf("集合1和集合2的差集:");
print_list(result);
return 0;
}
```
上面的代码中,我们通过 `Node` 结构体来定义一个节点,然后通过 `new_node` 函数创建一个新节点,通过 `insert` 函数将元素插入到有序链表中,通过 `print_list` 函数来打印链表。然后我们分别实现了集合的交、并、差运算,最后在 `main` 函数中进行测试。
阅读全文