单链表ADT模板简单应用算法设计:有序单链表的归并(非纯)

83 篇文章 5 订阅
67 篇文章 2 订阅
题目描述

目的:使用C++模板设计单链表的抽象数据类型(ADT)。并在此基础上,使用单链表ADT的基本操作,设计并实现单链表的简单算法设计。

内容:(1)请使用模板设计单链表的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考网盘中的ADT原型文件。)

(2)ADT的简单应用:使用该ADT设计并实现单链表应用场合的一些简单算法设计。

应用4:假设线性表 A和B,分别由单链表 La和Lb 存储,其中数据元素为整数,按值非递减有序排列(即已经有序),现要求设计一个算法,将A和B归并为一个线性表 , 其数据元素仍按值非递减排列,不要求提纯。要求使用A和B的原存储空间,且B不再单独存在。输入中的单链表的长度不得在归并算法中利用,仅作为建表使用。

参考函数原型:

template<class ElemType>

void Merge_L_Order( LinkList<ElemType> &A, LinkList<ElemType> &B );
输入说明

第一行:单链表A的长度

第二行:单链表A的数据元素(数据元素之间以空格分隔)

第三行:单链表B的长度

第四行:单链表B的数据元素(数据元素之间以空格分隔)

输出说明

第一行:单链表A的遍历结果

第二行:单链表B的遍历结果

第三行:归并后单链表A的遍历结果

输入范例
4
3 5 8 11
5
2 6 8 9 11
输出范例
3 5 8 11 
2 6 8 9 11 

2 3 5 6 8 8 9 11 11 
思路分析
  • 题设重点:

    • 序列成员是整数,并且已经按照非递减有序排列
    • 将A和B归并一个线性表,元素仍旧是按照非递减排列的
    • 不必提纯
  • 题目分析

    • 其实题目给得按时已经够多了,归并排序
    • 就像串珠一样,将两串已经按照非递减得顺序排好得珠串合成一个珠串
  • 图一
    在这里插入图片描述

    • Atemp是链表A的指针,上面穿着的是已经按照非递减序列排好的元素
    • Btemp是链表B的指针,上面穿着的是已经按照非递减序列拍好的元素
    • Ctemp是空的串线,等着放两者合并之后的串。
    • 注意:串线是指针,不占用内存空间的,只有元素才会真正占用内存空间
  • 图二

    • 依次比较两个串的首元素,将小的穿进C串中

在这里插入图片描述

  • 当某个一串已经空了的时候,直接将没空的串完全接到Ctemp中
伪代码
void Merge_L_Order( LinkList<ElemType> &A, LinkList<ElemType> &B )
{
	//获取两个链表序列的第一个结点的索引
    LinkNode<ElemType> *ATemp = A.GetHead()->next;
    LinkNode<ElemType> *BTemp = B.GetHead()->next;
    //创建一个新的结点索引,用来保存对应的最终的结点
    LinkNode<ElemType> *result = A.GetHead();
   
   	//同时遍历两个链表
    while(ATemp && BTemp)
    {
        if((ATemp->data) < (BTemp->data))
        {
            //move the smaller element to the sequence of result
            result->next = ATemp;
            result = result->next;
            ATemp = ATemp->next;
        }
        else
        {
            result->next = BTemp;
            result = result->next;
            BTemp = BTemp->next;
        }
	
	 //连接剩下的结点
    if(!ATemp)
    {
        result->next = BTemp;
    }

    if(!BTemp)
    {
        result->next = ATemp;
    }
    }

在这里插入图片描述

分析与总结
  • 经过无数次的分析,愣是搞不懂自己的哪里错了。忽然间惊讶发现,如果使用stirng去比较的话,那么11<8,string不是将字符串拆成一个一个的字符进行比较的吗?

在这里插入图片描述

在这里插入图片描述

如果不妥或者疑惑,请在评论区留言,或者加本人的扣扣651378276线上讨论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值