数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示(LA, LB递增有序情况下),求:一个新的集合C=A∪B,C仍然为纯集合,线性表采用链式存储方式。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /** 5 * 【数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示, 6 * 求:一个新的集合C=A∪B,C仍然为纯集合,线性表采用链式存储方式。 7 * 注:本算法中LA, LB为递增有序情况,无序的话可以考虑暴力 8 * 此情况下复杂度为o(m+n), m, n分别为LA, LB长度 9 **/ 10 typedef struct node 11 { 12 int data; 13 struct node *next; 14 } LinkNode; 15 16 // 初始化链表 17 void init_list(LinkNode *&list) 18 { 19 list = (LinkNode *)malloc(sizeof(LinkNode)); 20 list->next = NULL; 21 } 22 23 /** 24 * 链表中插入数据(尾插法) 25 * int sz[]为插入数据暂存数组, int len为数据个数 26 */ 27 void create_list(LinkNode *list, int sz[], int len) 28 { 29 LinkNode *p = list, *temp = NULL; 30 for (int i = 0; i < len; i++) 31 { 32 temp = (LinkNode *)malloc(sizeof(LinkNode)); 33 temp->data = sz[i]; 34 p->next = temp; 35 p = p->next; 36 } 37 p->next = NULL; 38 } 39 40 // 将两集合LA, LB合并为LC返回, LA,LB中元素递增有序(忽略free()操作) 41 LinkNode *list_union_list(LinkNode *LA, LinkNode *LB) 42 { 43 LinkNode *LC = NULL, *temp = NULL, *p = LA->next, *q = LB->next, *r; 44 init_list(LC); 45 r = LC; 46 while (p && q) 47 { 48 if (p->data < q->data) 49 { 50 temp = (LinkNode *)malloc(sizeof(LinkNode)); 51 temp->data = p->data; 52 r->next = temp; 53 p = p->next; 54 r = r->next; 55 } 56 else if (p->data > q->data) 57 { 58 temp = (LinkNode *)malloc(sizeof(LinkNode)); 59 temp->data = q->data; 60 r->next = temp; 61 q = q->next; 62 r = r->next; 63 } 64 else 65 { 66 temp = (LinkNode *)malloc(sizeof(LinkNode)); 67 temp->data = p->data; 68 r->next = temp; 69 p = p->next; 70 q = q->next; 71 r = r->next; 72 } 73 } 74 if (p) // 若p非空,即LA未遍历完,赋值给q 75 q = p; 76 while (q) // 遍历q,加到LC末尾 77 { 78 temp = (LinkNode *)malloc(sizeof(LinkNode)); 79 temp->data = q->data; 80 r->next = temp; 81 q = q->next; 82 r = r->next; 83 } 84 r->next = NULL; 85 return LC; 86 } 87 88 // 主函数 89 int main() 90 { 91 LinkNode *LA = NULL, *LB = NULL, *LC = NULL, *p = NULL; 92 // 初始化 93 init_list(LA); 94 init_list(LB); 95 // 声明构造LA, LB链表的数组 96 int la[] = {1, 8, 11, 13, 19, 21, 55, 100, 101, 200}; 97 int lb[] = {5, 8, 15, 26, 33, 69, 99, 100, 150, 200, 700, 999, 1024, 2048, 3333}; 98 // 构造LA, LB链表 99 create_list(LA, la, 10); 100 create_list(LB, lb, 15); 101 // 求取交集 102 LC = list_union_list(LA, LB); 103 p = LC->next; 104 while (p) // 遍历集合LC输出结果 105 printf("%d ", p->data), p = p->next; 106 return 0; 107 }
分类:
数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端