题目描述
目的:使用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线上讨论