数据结构 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 }

 

转载于:https://www.cnblogs.com/sqdtss/p/11166404.html

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值