数据结构(纯C语言)习题 2(链表版)
·
题目要求与样例同上
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 检查链表中是否存在指定值
int contains(Node* head, int value) {
Node* current = head;
while (current != NULL) {
if (current->data == value) return 1;
current = current->next;
}
return 0;
}
// 向链表追加新节点(自动去重)
void append(Node** head, int value) {
if (contains(*head, value)) return;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
// 输入集合处理函数
Node* inputSet(const char* setName) {
printf("%s={", setName);
Node* head = NULL;
int num;
while (scanf("%d", &num) == 1 && num >= 0) {
append(&head, num);
}
// 清除输入缓冲区
int c;
while ((c = getchar()) != '\n' && c != EOF);
printf("}\n");
return head;
}
// 集合求交集
Node* intersection(Node* A, Node* B) {
Node* result = NULL;
Node* current = A;
while (current != NULL) {
if (contains(B, current->data)) {
append(&result, current->data);
}
current = current->next;
}
return result;
}
// 集合求并集
Node* unionSet(Node* A, Node* B) {
Node* result = NULL;
Node* current = A;
// 添加A的所有元素
while (current != NULL) {
append(&result, current->data);
current = current->next;
}
// 添加B中不重复的元素
current = B;
while (current != NULL) {
append(&result, current->data);
current = current->next;
}
return result;
}
// 集合求差集(A-B)
Node* difference(Node* A, Node* B) {
Node* result = NULL;
Node* current = A;
while (current != NULL) {
if (!contains(B, current->data)) {
append(&result, current->data);
}
current = current->next;
}
return result;
}
// 打印集合
void printSet(Node* head) {
Node* current = head;
int first = 1;
while (current != NULL) {
printf("%s%d", first ? "" : ", ", current->data);
first = 0;
current = current->next;
}
}
// 释放链表内存
void freeList(Node* head) {
Node* current = head;
while (current != NULL) {
Node* temp = current;
current = current->next;
free(temp);
}
}
int main() {
Node* A = inputSet("A");
Node* B = inputSet("B");
Node* inter = intersection(A, B);
Node* uni = unionSet(A, B);
Node* diff = difference(A, B);
printf("A交B={");
printSet(inter);
printf("}\nA并B={");
printSet(uni);
printf("}\nA-B={");
printSet(diff);
printf("}\n");
// 释放所有链表内存
freeList(A);
freeList(B);
freeList(inter);
freeList(uni);
freeList(diff);
return 0;
}
更多推荐



所有评论(0)