十早月. 2023-12-14 17:58 采纳率: 16.7%
浏览 47
已结题

利用单链表存储集合(集合中不存在重复元素)。

【基本要求】
实现以下基本操作:
(1) 从键盘输入集合值,建立集合。
(2) 求集合的并、交和差,并输出结果。
(3) 可将集合信息保存在文件中,也可从文件中读取数据到集合

  • 写回答

17条回答 默认 最新

  • 社区专家-Monster-XH 2023-12-14 19:33
    关注
    获得0.60元问题酬金

    基于Monster 组和AIGC的调写:若有帮助,还望采纳~~:

    
    #include <stdio.h>
    #include <stdlib.h>
    
    // 链表节点结构体
    typedef struct Node {
        int data;           // 节点数据
        struct Node *next;  // 下一个节点的指针
    } Node;
    
    // 创建一个新节点
    Node* createNode(int data) {
        Node *newNode = (Node *)malloc(sizeof(Node)); // 分配新节点内存
        newNode->data = data;         // 设置节点数据
        newNode->next = NULL;         // 初始化下一个节点为NULL
        return newNode;               // 返回新节点指针
    }
    
    // 向链表中插入元素,保持元素唯一性
    void insertNode(Node **head, int data) {
        Node *current = *head;     // 当前节点指针
        Node *prev = NULL;         // 前一个节点指针
        while (current != NULL && current->data < data) {
            prev = current;        // 更新前一个节点指针
            current = current->next; // 更新当前节点指针
        }
        if (current == NULL || current->data > data) {
            Node *newNode = createNode(data); // 创建新节点
            if (prev == NULL) {
                newNode->next = *head; // 插入到链表头部
                *head = newNode;       // 更新链表头指针
            } else {
                newNode->next = current; // 插入到中间位置
                prev->next = newNode;    // 更新前一个节点的next指针
            }
        }
    }
    
    // 打印链表
    void printList(Node *head) {
        while (head != NULL) {
            printf("%d ", head->data); // 打印节点数据
            head = head->next;         // 移动到下一个节点
        }
        printf("\n");
    }
    
    // 求并集
    Node* unionSet(Node *head1, Node *head2) {
        Node *result = NULL; // 结果链表的头指针
        while (head1 != NULL && head2 != NULL) {
            if (head1->data < head2->data) {
                insertNode(&result, head1->data); // 插入head1的元素
                head1 = head1->next;             // 移动到head1的下一个节点
            } else if (head1->data > head2->data) {
                insertNode(&result, head2->data); // 插入head2的元素
                head2 = head2->next;             // 移动到head2的下一个节点
            } else {
                insertNode(&result, head1->data); // 插入相同元素
                head1 = head1->next;             // 移动到head1的下一个节点
                head2 = head2->next;             // 移动到head2的下一个节点
            }
        }
        while (head1 != NULL) {
            insertNode(&result, head1->data); // 处理剩余的head1元素
            head1 = head1->next;
        }
        while (head2 != NULL) {
            insertNode(&result, head2->data); // 处理剩余的head2元素
            head2 = head2->next;
        }
        return result; // 返回并集链表
    }
    
    // 求交集
    Node* intersectSet(Node *head1, Node *head2) {
        Node *result = NULL; // 结果链表的头指针
        while (head1 != NULL && head2 != NULL) {
            if (head1->data < head2->data) {
                head1 = head1->next; // 移动到head1的下一个节点
            } else if (head1->data > head2->data) {
                head2 = head2->next; // 移动到head2的下一个节点
            } else {
                insertNode(&result, head1->data); // 插入相同元素
                head1 = head1->next;             // 移动到head1的下一个节点
                head2 = head2->next;             // 移动到head2的下一个节点
            }
        }
        return result; // 返回交集链表
    }
    
    // 求差集
    Node* differenceSet(Node *head1, Node *head2) {
        Node *result = NULL; // 结果链表的头指针
        while (head1 != NULL) {
            Node *temp = head2;
            while (temp != NULL && temp->data < head1->data) {
                temp = temp->next;
            }
            if (temp == NULL || temp->data > head1->data) {
                insertNode(&result, head1->data); // 插入head1独有的元素
            }
            head1 = head1->next; // 移动到head1的下一个节点
        }
        return result; // 返回差集链表
    }
    
    // 从文件中读取集合
    void readSetFromFile(Node **head, const char *filename) {
        FILE *file = fopen(filename, "r"); // 打开文件
        if (file == NULL) {
            perror("Error opening file"); // 打开文件失败的错误提示
            return;
        }
        int data;
        while (fscanf(file, "%d", &data) != EOF) {
            insertNode(head, data); // 从文件中读取数据并插入链表
        }
        fclose(file); // 关闭文件
    }
    
    // 将集合保存到文件
    void saveSetToFile(Node *head, const char *filename) {
        FILE *file = fopen(filename, "w"); // 打开文件
        if (file == NULL) {
            perror("Error opening file"); // 打开文件失败的错误提示
            return;
        }
        while (head != NULL) {
            fprintf(file, "%d\n", head->data); // 将数据写入文件
            head = head->next; // 移动到下一个节点
        }
        fclose(file); // 关闭文件
    }
    
    // 主函数
    int main() {
        Node *set1 = NULL;
        Node *set2 = NULL;
    
        // 示例: 从文件读取集合
        readSetFromFile(&set1, "set1.txt");
        readSetFromFile(&set2, "set2.txt");
    
        printf("Set 1: ");
        printList(set1);
        printf("Set 2: ");
        printList(set2);
    
        Node *unionResult = unionSet(set1, set2);
        Node *intersectResult = intersectSet(set1, set2);
        Node *differenceResult = differenceSet(set1, set2);
    
        printf("并集: ");
        printList(unionResult);
        printf("交集: ");
        printList(intersectResult);
        printf("差集: ");
        printList(differenceResult);
    
    
        // 示例:将结果保存到文件
        saveSetToFile(unionResult, "并集结果.txt");
        saveSetToFile(intersectResult, "交集结果.txt");
        saveSetToFile(differenceResult, "差集结果.txt");
    
        return 0;
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 专家修改了标签 12月14日
  • 创建了问题 12月14日

悬赏问题

  • ¥15 求一份STM32F10X的I2S外设库
  • ¥15 android 打包报错
  • ¥15 关于stm32的问题
  • ¥15 ncode振动疲劳分析中,noisefloor如何影响PSD函数?
  • ¥50 寻找fpga的benchmark
  • ¥50 如何在arduino上,实现用4×4矩阵键盘按键控制2004显示屏输出图中显示功能的代码?
  • ¥15 P1口接8个发光二极管,利用定时计数器1编写程序
  • ¥20 keil5编译找不到.h文件该如何解决
  • ¥15 安卓EVS如何开启服务正常实现功能
  • ¥15 canal读取mysql时报错