码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 顺序表实现集合并集


    目录

    问题描述 

    程序设计 

    程序分析

    本节文章


    问题描述 

    【问题描述】

    设有两个用顺序表表示的有序集合,输出它们的并集,要求仍然保持有序。

    【输入形式】

    第一行输入两个整数N和M(不大于100),分别表示两个集合的长度;

    第二行输入第一个集合的N个元素(递增有序);

    第三行输入第二个集合的M个元素(递增有序);

    【输出形式】

    输出两个集合的并集(仍然保持有序),元素之间以空格分隔。

    【样例输入】

    5 4

    -3 2 4 7 20

    2 3 4 5

    【样例输出】

    -3 2 3 4 5 7 20

    【评分标准】

    采用顺序表表示集合。并集操作写成算法函数,利用顺序表基本操作实现并集功能。

    程序设计 

    1. #include
    2. #include
    3. #define MAX 10
    4. #define IN 10
    5. typedef struct List{
    6.     int *data;
    7.     int len;
    8.     int size;
    9. }List,*PList;
    10. int Init(PList L){
    11.     L->data=(int *)malloc(sizeof(int)*MAX);
    12.     L->len=0;
    13.     L->size=MAX;
    14.     return 1;
    15. } 
    16. int Create(PList L,int n){
    17.     int i;
    18.     for(i=0;i
    19.         scanf("%d",&L->data[i]);
    20.         L->len++;
    21.     } 
    22.     return 1;
    23. }
    24. int Print(PList L){
    25.     int i;
    26.     for(i=0;ilen;i++){
    27.         printf("%d ",L->data[i]);
    28.     }
    29.     printf("\n");
    30.     return 1;
    31. }
    32. int Connect(PList L1,PList L2,PList L3){
    33.     int i=0,j=0,k=0;
    34.     if(L3->size<=L1->len+L2->len){
    35.         L3->data=(int *)realloc(L3->data,(L3->size+IN)*sizeof(int));
    36.         L3->size+=IN;
    37.     }
    38.     while(ilen&&jlen){
    39.         if(L1->data[i]==L2->data[j]){
    40.             j++;
    41.         }
    42.         if(L1->data[i]data[j]){
    43.             L3->data[k++]=L1->data[i++];
    44.         }else{
    45.             L3->data[k++]=L2->data[j++];
    46.         }
    47.     }
    48.     while(ilen){
    49.         L3->data[k++]=L1->data[i++];
    50.     }
    51.     while(jlen){
    52.         L3->data[k++]=L2->data[j++];
    53.     }
    54.     L3->len=k;
    55.     return 1;
    56. }
    57. int main(){
    58.     List L1,L2,L3;
    59.     int m,n;
    60.     Init(&L1);
    61.     Init(&L2);
    62.     Init(&L3);
    63.     scanf("%d %d",&m,&n);
    64.     Create(&L1,m);
    65.     Create(&L2,n);
    66.     Connect(&L1,&L2,&L3);
    67.     Print(&L3);
    68.     return 0;
    69. }

    程序分析

    这是一个C语言程序,主要实现两个有序列表的合并。程序中用到了动态内存分配和realloc函数,可以在程序运行时动态调整所需要的内存空间。

    主要流程:

    1. 定义一个结构体List,其中包含一个动态int数组data,列表长度len和列表所占的内存空间size;
    2. 定义Init函数,用于初始化一个列表;
    3. 定义Create函数,用于创建一个列表并赋值;
    4. 定义Print函数,用于输出一个列表中的所有元素;
    5. 定义Connect函数,用于将两个有序列表合并为一个新的有序列表;
    6. 在主函数中,先定义三个List类型的变量L1、L2、L3,分别表示两个待合并的有序列表和合并后的结果列表;
    7. 通过Init函数对三个列表进行初始化;
    8. 通过Create函数分别对L1和L2列表进行初始化;
    9. 调用Connect函数合并L1和L2列表到L3列表中;
    10. 调用Print函数输出L3列表中的所有元素。

    程序的主要思路是将L1和L2两个有序列表中的元素逐一比较并放入L3列表中,最后得到一个有序的L3列表。在比较过程中,如果L1和L2中有相同的元素,则将相同的元素放入L3中一次即可。如果L1和L2中有不同的元素,则将较小的元素放入L3中,并进行下一轮比较。当L1和L2中有一个已经比较完毕后,将剩下的元素全部放入L3中即可。

    需要注意的是,程序中需要实时检查L3列表的内存空间是否足够,如果不够则需要进行动态扩展。这里使用了realloc函数进行动态内存分配,当L3列表的内存空间不够时,可以将L3列表的空间扩展一个固定大小(这里定义为10)。

    总体来说,这个程序比较简单易懂,但需要注意动态内存分配和realloc函数的使用。

    本节文章

    顺序表
    1C语言实现顺序表的插入、删除https://want595.blog.csdn.net/article/details/126967798
    2顺序表基本练习-初始化、插入和输出https://want595.blog.csdn.net/article/details/127737121
    3顺序表基本练习-删除元素https://want595.blog.csdn.net/article/details/127737165
    4顺序表基本操作-查找https://want595.blog.csdn.net/article/details/127737191
    5顺序表删除重复元素https://want595.blog.csdn.net/article/details/126998125
    6顺序表实现集合并集https://want595.blog.csdn.net/article/details/127737454
    7顺序表元素循环左移(new)https://want595.blog.csdn.net/article/details/128281975
    8删除顺序表中最小值https://want595.blog.csdn.net/article/details/126984319
    9递增顺序表插入https://want595.blog.csdn.net/article/details/126990708
    10将顺序表非零元素依次移到表的前端https://want595.blog.csdn.net/article/details/127737349
    11删除顺序表中第一个值等于x的元素https://want595.blog.csdn.net/article/details/127619864
    12在顺序表中,输入一个元素插入到原表的最小元素之前https://want595.blog.csdn.net/article/details/127365247
  • 相关阅读:
    全能成熟稳定开源分布式存储Ceph破冰之旅-上
    【Linux】linux中你不得不爱的命令集(上)
    使用curl命令发送POST请求(带token)
    防火墙、firewalld指令、更改yum源为阿里云的yum源及常见问题
    Java ElasticSearch-Linux面试题
    java计算机毕业设计高中生学业水平测试系统源码+mysql数据库+系统+lw文档+部署
    nvm下载安装教程
    如何查看华为笔记本的型号与硬件配置 ?
    centos7.x本地挂载阿里云oss
    计算机视觉 立体视觉极简一览
  • 原文地址:https://blog.csdn.net/m0_68111267/article/details/127737454
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号