假设有两个按元素值递增有序排列的线性表 A 和 B,均以单链表作为存储结构,请编写算法将 A 表和 B 表归并成一个按元素递减有序排列的线性表 C,并要求利用原表的节点空间构造 C 表。

20 篇文章 32 订阅
订阅专栏

NOTICE: 代码是按照源码顺序依次贴上来的,直接复制就能跑!

环境:

Visual Stdio Code

题目

假设有两个按元素值递增有序排列的线性表 A 和 B,均以单链表作为存储结构,请编写算法将 A 表和 B 表归并成一个按元素递减有序排列的线性表 C,并要求利用原表(即 A 表和 B 表)的节点空间构造 C 表。

分析

因为表 A 和表 B 都是按照递增有序排列的,我们没有办法同时进行逆置跟归并,所以我们要先将 A 表和 B 表逆置,再将两个表归并。

程序

初始化:

#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0

typedef int ElemType;
typedef int Status;

typedef struct LNode
{
    ElemType data;
    LNode *next;
}LNode, *LinkList;

Status InitList(LinkList &L)
{   // 初始化单链表 L
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;

    return OK;
}//InitList

创建单链表 L:

Status CreateList(LinkList &L, int e)
{   // 创建单链表 L
    LinkList p = L;
    while(p->next)
        p = p->next;
    LinkList temp = (LinkList)malloc(sizeof(LNode));
    temp->data = e;
    temp->next = NULL;
    p->next = temp;

    return OK;
}//CreateList

打印单链表:

Status DispList(LinkList &L)
{   // 打印单链表 L
    LinkList p = L->next;
    while(p)
    {
        printf("%d\t", p->data);
        p = p->next;
    }
    return OK;
}//DispList

逆置:

Status ListOppose(LinkList &L)
{   // 将带表头节点的单链表逆置
    LinkList q, p, s;
    p = L;
    p = p->next;
    L->next = NULL;
    while(p)
    {
        q = p;
        p = p->next;
        q->next = L->next;
        L->next = q;
    }
    return OK;
}//ListOppose

归并:

Status ListMerge(LinkList &A, LinkList &B, LinkList &C)
{   // 合并两个递增单链表 A, B 成一个递增有序单链表 C
    LinkList qa, pa, pb, qb;
    pa = A;  qa = pa;   pa = pa->next;
    pb = B->next;
    C = A;
    while(pa && pb)
    {
        if(pa->data <= pb->data)  // 当 pa 的值 小于等于 pb 的值的时候,将 pb 插入到 pa 的                    
                                  // 前边
        {
            qb = pb;       // qb 为待插入节点
            pb = pb->next;    // pb 后移,为以后的插入做准备
            qb->next = qa->next;    // 本行和下一行代码做插入操作
            qa->next = qb;
            qa = qa->next;    // qa 后移,为以后的插入做准备
        }
        else // pa 的值大于 pb 的值
        {
            if(pa->data == pa->next->data) pa = pa->next;  // pa 的值和 pa 直接后继节点的 
                                                           // 值相等,pa 向后移        
                                                            
            qb = pb;                    // qb 为待插入节点
            pb = pb->next;
            qb->next = pa->next;      // 本行和下一行代码做插入操作 
            pa->next = qb;            
            pa = pa->next;            // pa 后移,为以后的插入做准备
        }
    }
    free(B);    // 释放 B 链表的头结点

    return OK;
}//ListMerge

主函数:

int main()
{
    LinkList A, B, C;
    InitList(A);    InitList(B);
    for(int i = 1; i< 6; i++)
        CreateList(A, i);
    for(int j = 4; j < 11; j++)
        CreateList(B, j);
    printf("\nA 链表为:\n");
    DispList(A);
    printf("\nB 链表为:\n");
    DispList(B);
    printf("\nC 链表为:\n");
    // 逆置
    ListOppose(A);
    ListOppose(B);
    printf("\n逆置后的 A 链表为:\n");
    DispList(A);
    printf("\n逆置后的 B 链表为:\n");
    DispList(B);
    // 归并
    ListMerge(A, B, C);
    printf("\n合并后的 C 链表为:\n");
    DispList(C);

    return OK;
}

详细说明:

从主函数中可以看出,经过初始化、创建以后的表 A 和表 B 分别为:

逆置之前有一篇文章单独细讲过,这里就不再赘述了。逆置后的两个表:

归并:

我们归并前先将所有可能发生的情况列出来:

(1) pa->data <= pb->data
(2) pa->data > pb->data
又分为以下两种种情况:
   1. pa->data == pa->next->data   
   2. pa->data > pa->next->data
  

当 pa->data <= pb->data 的时候,我们直接将 pb 插入到 pa 的前边就行:

qb = pb;
qb->next = qa->next;
qa->next = qb;

当 pa->data > pb->data 的时候,又会细分为两种情况:

第一种 pa->data == pa->next->data 即:pa 的值等于 pa 直接后继的值(此时的 pa 指向的是两个相同元素的左边那个)。我们必须将 pa 向后移动,不然就会使得 pb 插入到这两个相同元素的中间;

第二种 pa->data > pa->next->data 这种情况直接将 pb 插入到 pa 的后边就行。

归并过程我整理了一个 动画(动画只是演示,并没有声音,请各位看客见谅)

运行结果示意图:

THE END!

设A和B是两个单链表,其表中元素递增有序
11-29
设A和B是两个单链表,其表中元素递增有序。试算法将A和B归并一个元素递减有序单链表C,并要求辅助空间为O(1),试分析算法的时间复杂度。
已知有两个元素递增有序的顺序A和B,设计一个算法A和B的全部元素归并一个元素递增有序的顺序C。
03-27
已知有两个元素递增有序的顺序A和B,设计一个算法A和B的全部元素归并一个元素递增有序的顺序C。
数据结构以及应用算法教程参考答案(2)第二章答案上
最新发布
VAN
04-01 6780
第2章 线性表 2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。   解:头指针是指向链表中第一个结点的指针。首元结点是指链表中存储第一个数据元素的结点。头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。它可以对空、非空以及首元结点的操作进行统一处理。 2.2 填空题。   解:(1) 在顺序表中插入或删除一个元素,需要平移动表中一半元素,具体移动的元素个数与元素表中的位置有关。 (2) 顺序表中逻辑上相
[作业]【C语言实现】假设两个元素递增有序排列线性表A和B,单链表作为存储结构编写算法,将A和B归并一个元素递减有序排列线性表C,并要求利用原表结点。
screaming_zz的博客
10-08 5884
两个单链表的合并问题(1)习题一:新的改变功能快捷键合理的创建标题,有助于目录的生如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生一个适合你的列创建一个格设定内容居中、居左、居右SmartyPants创建一个自定义列如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图FLowchart流程图导出与导入导出导入 (1)习题一: 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读
假设两个元素递增有序排列线性表A和B,单链表作为存储结构编写算法,将A和B归并一个元素递减有序排列线性表C,并要求利用原表(即A和B的)结点空间存放C。
weixin_43943281的博客
09-25 1万+
假设两个元素递增有序排列线性表A和B,单链表作为存储结构编写算法,将A和B归并一个元素递减有序排列线性表C,并要求利用原表(即A和B的)结点空间存放C。 /* 2019/9/25 By ASJA */ #include<stdio.h> #include<iostream> typedef struct LinkNode { int dat...
假设两个元素递增有序排列线性表A和B,单链表存储结构编写算法将A和B归并一个元素递减 有序(即非递增有序,允许表中含有相同的元素排列线性表C,并要求利用原装(即A和...
晚晴小筑
03-23 3489
假设两个元素递增有序排列线性表A和B,单链表存储结构编写算法将A和B归并一个元素递增 有序(即非递增有序,允许表中含有相同的元素排列线性表C,并要求利用原装(即A和B)的结点空间构造C。 采用的方法: 尾插法 #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;cstdio...
假设两个元素递增有序排列线性表 A 和 B,单链表存储结构编写算 法将 A 和 B 归并一个元素递减有序(即非递增有序,允许表中含有相同的元素排列线性表 C,并要求
热门推荐
jwhazt的博客
11-13 1万+
1.先定义一个结构体。 typedef struct Node { int data; struct Node*next; }Node,*List; 2.给这个结构体初始化,即得到一个头结点 void InitList(List plist) { assert(plist != NULL); plist-&gt;next = NULL; } 3.用尾插法给两个单链表插入数据 ...
已知线性表中的元素递增有序排列,并以单链表存储结构。试一高效的算法,删除表中所有相同的多余元素(使得操作后的线性表中所有元素不相同)
11-24
包含一个函数,参数为链表头地址,返回经过处理的新的链表头地址。该函数将一个按照升序排列链表中的重复元素删除,时间复杂度为(n)
有两张单调递增有序线性表A和B-采用顺序存储结构-将这两张合并C-要求C单调递减有序。Wo.pdf
05-05
本文将讨论如何将两个单调递增有序线性表A和B合并一个单调递减有序线性表C, 并实现线性表的逆置操作。 线性表的基本概念 在计算机科学中,线性表是一种基本的数据结构。它是一种由若干个元素有序集合...
数据结构实验报告-线性表-两个有序线性表归并算法
04-10
从键盘输入数据,建立两个有序线性表(每个线性表的输入数据按由小到大次序输入来建立线性表,不必考虑排序算法);输出建好的这两个有序线性表;将这两个有序线性表归并一个有序线性表;输出归并后的有序线性表。 ...
一个线性表(a1,a2,...,an),它存储在有附加头结点的单链表中,一个算法,求出该线性表为x的元素的序号。如果x
09-27
一个线性表(a1,a2,...,an),它存储在有附加头结点的单链表中,一个算法,求出该线性表为x的元素的序号。如果x
A,B两个链表,其表中元素递增有序,把A,B和一个链表
10-24
A,B两个链表,其表中元素递增有序,把A,B和一个链表
合并线性表
01-01
假设两个元素递增有序排列线性表A和B,单链表作为存储结构编写算法,将A和B归并一个元素递减有序排列线性表C,并要求利用原表结点空间存放C。
数据结构算法教学大纲程序代码
12-26
3、假设两个元素递增有序线性表A和B,单链表存储结构,试编写算法将A和B归并一个元素递减有序线性表C,并要求利用原表空间存放C。 要求:熟练掌握线性表的单链式链接存储结构及在其上...
数据结构算法c++实现 两个顺序元素严格单调递增,将其共同元素保存到新顺序表中,且为递增排序
06-04
数据结构算法 c++实现 改变顺序元素次序,两个顺序元素严格单调递增,将其共同元素保存到新顺序表中,且为递增排序可直接运行 代码有批注 适合大二初学数据结构算法
数据结构 两个有序线性表归并算法 西南交通大学
02-13
数据结构-两个有序线性表归并算法数据结构中,两个有序线性表归并算法一个基本的算法题目。该算法的目的是将两个有序线性表合并为一个有序线性表。该算法的实现可以采用顺序存储结构链表存储结构。 ...
设A和B是两个单链表,其表中元素递增有序,使用一算法将A和B归并一个元素递减有序单链表C
江冷易水寒
08-21 7929
代码: LinkList* commonElem(LinkList* L1,LinkList* L2){ LinkList* L = new LinkList; LinkList* rear = L; LinkList* p1 = L1->next; LinkList* p2 = L2->next; while(p1!=NULL && p2!=NULL){ //如果相同,尾插法插入链表L if(p1-&g
假设两个元素递增次序排列线性表单链表形式存储。编写算法将这两个单链表归并一个元素递减次序排列单链表,并要求利用原来两个单链表的结点存放归并后的单链表
thq_kuqi的博客
10-14 242
【代码】假设两个元素递增次序排列线性表单链表形式存储。编写算法将这两个单链表归并一个元素递减次序排列单链表,并要求利用原来两个单链表的结点存放归并后的单链表
假设两个元素递增有序排列线性表a和b,单链表存储结构编写算法a和b归并一个元素递减有序(允许相同)排列线性表c。
03-16
算法如下: 1. 定义三个指针p、q、r,分别指向a、b、c的当前节点。 2. 比较p和q所指节点,将较小的节点插入到c的末尾,并将指针后移一位。 3. 如果p或q已经到达尾,则将另一个的剩余节点插入到c的末尾。 4. 返回c。 具体实现如下: ``` List merge(List a, List b) { List c = new List(); Node p = a.head, q = b.head, r = c.head; while (p != null && q != null) { if (p.value <= q.value) { r.next = p; p = p.next; } else { r.next = q; q = q.next; } r = r.next; } if (p != null) { r.next = p; } if (q != null) { r.next = q; } return c; } ```

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 安装MongoDB出现Verify that you have sufficient privileges to start system services以及配置系统服务的问题总结 34945
  • 试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1, a2,..., an)逆置为(an, an-1, ..., a1) 28537
  • jupyter notebook 运行出现[*]么得运行结果解决方法 23781
  • 两个连续函数复合(加减乘除)之后还是连续函数吗? 18537
  • 假设有两个按元素值递增有序排列的线性表 A 和 B,均以单链表作为存储结构,请编写算法将 A 表和 B 表归并成一个按元素递减有序排列的线性表 C,并要求利用原表的节点空间构造 C 表。 18306

分类专栏

  • 数据结构 20篇
  • jupyternotebook 1篇
  • 高数
  • Flask 1篇
  • 3篇
  • 爬虫-flask 4篇
  • MySQL 1篇
  • pip问题 1篇

最新评论

  • jupyter notebook 打开没有报错但是浏览器空白页问题解决方法

    m9_22458869: 我是用edge 和chorme都打不开,而且运行终端也没有报错

  • 两个连续函数复合(加减乘除)之后还是连续函数吗?

    璐璐炒鸡酷: 连续函数经过加减乘除和复合在定义域内都是连续的,你举的这个例子因为分母不为零,所所以自然定义域就是不包括零点,定义域都没有零点何谈连续,但是在定义域上还是连续的。

  • 已知单链表 A, B 和 C 均为递增有序排列,现要求对 A 表作如下操作:删去那些既在 B 表中出现又在 C 表中出现的元素。试对单链表编写实现上述操作的算法。

    m0_67132983: 不对吧

  • 设顺序表 Va 中的数据元素递增有序。试写一算法,将 x 插入到顺序表的适当位置上,以保证该表的有序性

    CSDN-Ada助手: 多亏了你这篇博客, 解决了问题: https://ask.csdn.net/questions/8025690, 请多输出高质量博客, 帮助更多的人

  • 已知单链表 A, B 和 C 均为递增有序排列,现要求对 A 表作如下操作:删去那些既在 B 表中出现又在 C 表中出现的元素。试对单链表编写实现上述操作的算法。

    CSDN-Ada助手: 多亏了你这篇博客, 解决了问题: https://ask.csdn.net/questions/8024379, 请多输出高质量博客, 帮助更多的人

大家在看

  • 建立生活系统
  • [HAOI2008] 硬币购物(完全背包问题,容斥原理)
  • Jjenkins 镜像制作
  • 深入解析Linux中的用户态与内核态
  • 可灵王炸更新,图生视频、视频续写,最长可达3分钟!Runway 不香了 ...

最新文章

  • jupyter notebook 打开没有报错但是浏览器空白页问题解决方法
  • flask运行第二个项目的时候显示的是第一个项目的网页探究
  • 双端队列[《数据结构题集》(C语言版) 3.14题解答与总结]
2020年25篇
2019年6篇
2018年1篇

目录

目录

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司龙华关键词按天计费光明网页制作爱联百搜标王福田品牌网站设计荷坳网站关键词优化坑梓百度网站优化南澳关键词排名大浪外贸网站建设横岗网站开发广州标王观澜关键词排名包年推广双龙至尊标王广州建网站沙井设计网站龙华关键词排名包年推广坪地seo排名福永百度网站优化排名光明推广网站丹竹头标王布吉企业网站改版坑梓网站优化推广深圳阿里店铺运营龙岗模板网站建设西乡推广网站西乡外贸网站设计南联品牌网站设计布吉设计网站坪地网站优化按天收费盐田网站改版南澳百度网站优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化