写一段利用线性表实现两个整数集合的交集,并集,做差的C语言程序
时间: 2024-09-30 16:05:41 浏览: 31
在C语言中,我们可以使用数组或链表来表示集合,这里我们选择链表作为数据结构。首先,我们需要定义一个结构体`ListNode`来表示链表节点,以及一些函数来创建、添加元素到集合、查找元素以及操作集合。
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct ListNode {
int value;
struct ListNode* next;
} ListNode;
// 创建空链表
ListNode* createList() {
return (ListNode*)malloc(sizeof(ListNode));
}
// 向链表添加元素
void addToList(ListNode** head, int val) {
ListNode* newNode = createList();
newNode->value = val;
newNode->next = *head;
*head = newNode;
}
// 查找元素是否在链表中
int isInList(ListNode* head, int val) {
while (head != NULL) {
if (head->value == val)
return 1; // 找到了
head = head->next;
}
return 0; // 没找到
}
// 计算两个集合的交集
ListNode* intersection(ListNode* list1, ListNode* list2) {
ListNode* intersectionHead = NULL;
ListNode* cur1 = list1, *cur2 = list2;
while (cur1 != NULL && cur2 != NULL) {
if (cur1->value == cur2->value) {
if (intersectionHead == NULL) {
intersectionHead = cur1;
} else {
ListNode* newNode = createList();
newNode->value = cur1->value;
newNode->next = intersectionHead;
intersectionHead = newNode;
}
cur1 = cur1->next;
cur2 = cur2->next;
} else if (cur1->value < cur2->value) {
cur1 = cur1->next;
} else {
cur2 = cur2->next;
}
}
return intersectionHead;
}
// 计算并集
ListNode* unionList(ListNode* list1, ListNode* list2) {
ListNode* unionHead = NULL;
ListNode* temp1 = list1, *temp2 = list2;
while (temp1 != NULL) {
addToList(&unionHead, temp1->value);
temp1 = temp1->next;
}
while (temp2 != NULL) {
if (!isInList(unionHead, temp2->value)) {
addToList(&unionHead, temp2->value);
}
temp2 = temp2->next;
}
return unionHead;
}
// 计算差集
ListNode* differenceList(ListNode* list1, ListNode* list2) {
ListNode* diffHead = createList();
ListNode* cur1 = list1, *diffCur = diffHead;
while (cur1 != NULL) {
if (!isInList(list2, cur1->value)) {
addToList(&diffCur, cur1->value);
}
cur1 = cur1->next;
}
return diffCur;
}
// 打印链表
void printList(ListNode* head) {
while (head != NULL) {
printf("%d -> ", head->value);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 创建两个示例链表
ListNode* list1 = createList();
addToList(&list1, 1);
addToList(&list1, 2);
addToList(&list1, 3);
ListNode* list2 = createList();
addToList(&list2, 2);
addToList(&list2, 4);
// 输出初始链表
printList(list1);
printList(list2);
// 计算交集、并集和差集
ListNode* intersect = intersection(list1, list2);
ListNode* unionResult = unionList(list1, list2);
ListNode* diffResult = differenceList(list1, list2);
// 输出结果
printf("\nIntersection: ");
printList(intersect);
printf("\nUnion: ");
printList(unionResult);
printf("\nDifference: ");
printList(diffResult);
return 0;
}
```
这个程序首先创建两个整数链表,然后分别计算它们的交集、并集和差集,并将结果打印出来。
阅读全文