题目要求与样例同上

#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;
}

更多推荐