【基本要求】
实现以下基本操作:
(1) 从键盘输入集合值,建立集合。
(2) 求集合的并、交和差,并输出结果。
(3) 可将集合信息保存在文件中,也可从文件中读取数据到集合
利用单链表存储集合(集合中不存在重复元素)。
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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; }
解决 2无用
悬赏问题
- ¥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时报错