单链表ADT模板简单应用算法设计:有序单链表的提纯

问题描述

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

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

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

应用5:试设计一个算法,删除有序单链表A中的冗余元素,即使得操作之后的单链表中只保留操作之前表中所有值都不相同的元素,并保持其有序性。要求利用原表中的结点,并释放A表中冗余的结点空间。

参考函数原型:

template<class ElemType>

void Purge_Lk_OL( LinkList<ElemType> &A ); //测试数据限定为整数。实际应用时,不受其限制

输入说明

第一行:单链表A的长度

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

输出说明

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

第二行:提纯后单链表A的遍历结果

(输入与输出之间以空行分隔)

输入范例

7
3 3 5 5 8 11 11

输出范例

3 3 5 5 8 11 11 

3 5 8 11 

思路分析

  • 题目重点

    • 删除有序单链表A中的冗余元素
    • 仍旧保持有序性
    • 释放A表中的冗余的结点的空间
  • 思路分析

    • 链表A已经石有序的,所以相同的元素一定是排在一块的
    • 将几个连续相同的元素进行删除,并保留一个
    • 默认是测试数据是整型,所以就不需要在写成string
  • 完成的思路,好比两块磁石,同极相斥,异极相斥。当两块磁石

伪代码

void Purge_Lk_OL( LinkList<ElemType> &A )
{
    //get two pointers of the head of the linklist
    LinkNode<ElemType> *Afront = A.GetHead()->next;
    LinkNode<ElemType> *Aback = A.GetHead()->next;

    while(Aback)
    {
        if(Aback->data != Afront->data)
        {
            //change the link and move two linknodes together
            Afront->next = Aback;
            Afront = Aback;
        }
        Aback = Aback->next;
    }
    Afront->next = NULL;

}

在这里插入图片描述

分析与总结

  • 如果能用动态图来制作相关的图片就很简单了,但是图片制作太费功夫了
  • 注意,当最后的一连串的元素都是重复的,后指针Aback一定遍历为空,从而跳出循环,不能排除最后的重复的元素,所以在循环的末尾需要将Afront的next域置为空

在这里插入图片描述
如果不妥或者疑惑,请在评论区留言,或者加本人的扣扣651378276线上讨论

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页