动态单链表实现集合的并、交和差运算
时间: 2024-01-27 10:04:35 浏览: 72
动态单链表可以用来实现集合,因为它可以动态地增加或删除元素。下面是动态单链表实现集合的并、交和差运算的方法:
1. 集合的表示
首先,我们需要定义一个结构体来表示集合中的每一个元素:
```
typedef struct node {
int val; // 值
struct node *next; // 指向下一个元素的指针
} Node;
```
然后,我们定义一个链表结构体来表示整个集合:
```
typedef struct {
Node *head; // 指向链表头的指针
int size; // 集合的大小
} Set;
```
2. 集合的创建和销毁
我们可以定义一个函数来创建一个新的集合:
```
Set *createSet() {
Set *set = (Set *)malloc(sizeof(Set));
set->head = NULL;
set->size = 0;
return set;
}
```
我们也需要定义一个函数来销毁一个集合:
```
void destroySet(Set *set) {
Node *p = set->head;
while (p != NULL) {
Node *q = p->next;
free(p);
p = q;
}
free(set);
}
```
3. 集合的插入和删除
我们可以定义一个函数来插入一个元素到集合中:
```
void insert(Set *set, int val) {
Node *p = set->head;
Node *q = NULL;
while (p != NULL && p->val < val) {
q = p;
p = p->next;
}
if (p == NULL || p->val > val) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->val = val;
newNode->next = p;
if (q == NULL) {
set->head = newNode;
} else {
q->next = newNode;
}
set->size++;
}
}
```
我们也需要定义一个函数来删除一个元素:
```
void remove(Set *set, int val) {
Node *p = set->head;
Node *q = NULL;
while (p != NULL && p->val < val) {
q = p;
p = p->next;
}
if (p != NULL && p->val == val) {
if (q == NULL) {
set->head = p->next;
} else {
q->next = p->next;
}
free(p);
set->size--;
}
}
```
4. 集合的并、交和差运算
现在我们已经定义了集合的插入和删除操作,我们可以使用这些操作来实现集合的并、交和差运算。
首先,我们来实现集合的并运算。集合的并运算可以通过将两个集合中的所有元素合并成一个新的集合来实现:
```
Set *unionSet(Set *set1, Set *set2) {
Set *set = createSet();
Node *p1 = set1->head;
Node *p2 = set2->head;
while (p1 != NULL && p2 != NULL) {
if (p1->val < p2->val) {
insert(set, p1->val);
p1 = p1->next;
} else if (p1->val > p2->val) {
insert(set, p2->val);
p2 = p2->next;
} else {
insert(set, p1->val);
p1 = p1->next;
p2 = p2->next;
}
}
while (p1 != NULL) {
insert(set, p1->val);
p1 = p1->next;
}
while (p2 != NULL) {
insert(set, p2->val);
p2 = p2->next;
}
return set;
}
```
接下来,我们来实现集合的交运算。集合的交运算可以通过遍历两个集合中的所有元素,找到它们的交集来实现:
```
Set *intersect(Set *set1, Set *set2) {
Set *set = createSet();
Node *p1 = set1->head;
Node *p2 = set2->head;
while (p1 != NULL && p2 != NULL) {
if (p1->val < p2->val) {
p1 = p1->next;
} else if (p1->val > p2->val) {
p2 = p2->next;
} else {
insert(set, p1->val);
p1 = p1->next;
p2 = p2->next;
}
}
return set;
}
```
最后,我们来实现集合的差运算。集合的差运算可以通过遍历一个集合中的所有元素,找到它们和另一个集合的差集来实现:
```
Set *difference(Set *set1, Set *set2) {
Set *set = createSet();
Node *p1 = set1->head;
Node *p2 = set2->head;
while (p1 != NULL && p2 != NULL) {
if (p1->val < p2->val) {
insert(set, p1->val);
p1 = p1->next;
} else if (p1->val > p2->val) {
p2 = p2->next;
} else {
p1 = p1->next;
p2 = p2->next;
}
}
while (p1 != NULL) {
insert(set, p1->val);
p1 = p1->next;
}
return set;
}
```
到此为止,我们已经实现了动态单链表实现集合的并、交和差运算。
阅读全文