c语言用链表实现集合的交并补差代码
时间: 2023-06-02 22:05:13 浏览: 133
以下是用C语言实现集合的交、并、补、差的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define LISTSIZE 100
// 链表结构体
typedef struct node
{
int data;
struct node *next;
} node;
// 初始化链表
void initLinkedList(node **head)
{
*head = NULL;
}
// 在链表尾部插入节点
void insertNode(node **head, int x)
{
node *newNode = malloc(sizeof(node));
newNode->data = x;
newNode->next = NULL;
if (*head == NULL)
{
*head = newNode;
}
else
{
node *p = *head;
while (p->next != NULL)
{
p = p->next;
}
p->next = newNode;
}
}
// 从链表中删除节点
void deleteNode(node **head, int x)
{
node *p = *head;
node *prev = NULL;
while (p != NULL && p->data != x)
{
prev = p;
p = p->next;
}
if (p != NULL)
{
if (prev != NULL)
{
prev->next = p->next;
free(p);
}
else
{
*head = p->next;
free(p);
}
}
}
// 检查链表中是否包含某个值
int contains(node *head, int x)
{
node *p = head;
while (p != NULL)
{
if (p->data == x)
{
return 1;
}
p = p->next;
}
return 0;
}
// 输出集合中的元素
void printSet(node *head)
{
node *p = head;
printf("{ ");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("}\n");
}
// 集合交操作
void setIntersection(node *set1, node *set2, node **result)
{
node *p = set1;
while (p != NULL)
{
if (contains(set2, p->data))
{
insertNode(result, p->data);
}
p = p->next;
}
}
// 集合并操作
void setUnion(node *set1, node *set2, node **result)
{
node *p = set1;
while (p != NULL)
{
insertNode(result, p->data);
p = p->next;
}
p = set2;
while (p != NULL)
{
if (!contains(*result, p->data))
{
insertNode(result, p->data);
}
p = p->next;
}
}
// 集合补操作
void setComplement(node *universe, node *set, node **result)
{
node *p = universe;
while (p != NULL)
{
if (!contains(set, p->data))
{
insertNode(result, p->data);
}
p = p->next;
}
}
// 集合差操作
void setDifference(node *set1, node *set2, node **result)
{
node *p = set1;
while (p != NULL)
{
if (!contains(set2, p->data))
{
insertNode(result, p->data);
}
p = p->next;
}
}
int main()
{
node *set1, *set2, *result;
int i;
// 初始化集合1
initLinkedList(&set1);
insertNode(&set1, 1);
insertNode(&set1, 2);
insertNode(&set1, 3);
// 初始化集合2
initLinkedList(&set2);
insertNode(&set2, 2);
insertNode(&set2, 3);
insertNode(&set2, 4);
// 初始化结果集
initLinkedList(&result);
// 集合交操作
setIntersection(set1, set2, &result);
printf("Intersection: ");
printSet(result);
initLinkedList(&result);
// 集合并操作
setUnion(set1, set2, &result);
printf("Union: ");
printSet(result);
initLinkedList(&result);
// 集合补操作
node *universe;
initLinkedList(&universe);
for (i = 1; i <= 5; i++)
{
insertNode(&universe, i);
}
setComplement(universe, set1, &result);
printf("Complement: ");
printSet(result);
initLinkedList(&result);
// 集合差操作
setDifference(set1, set2, &result);
printf("Difference: ");
printSet(result);
initLinkedList(&result);
return 0;
}
```
注意,这段代码仅仅是一个示例,仅仅是 C 语言用链表实现集合的交并补差的一种实现方法。实际上,你可以使用任何一门编程语言,用任何一种数据结构(如数组、哈希表等)来实现集合的交、并、补、差操作。
阅读全文