单链表ADT模板简单应用算法设计:单链表指定结点的移动(想找一个一块学习的女友)

问题描述

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

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

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

应用2:设计一个算法,使用带头结点的单链表存储结构,将链表中数值域值最小的那个结点移到链表的最前面。要求:不得额外申请新的结点。

参考函数原型:

template<class ElemType>
void Linklist_MoveMinToFirst( LinkList<ElemType> &A );

输入说明

第一行:单链表A的长度

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

输出说明

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

第二行:移动后单链表A的遍历结果

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

输入范例

10
013 005 027 009 032 123 076 098 054 087

输出范例

013 005 027 009 032 123 076 098 054 087 

005 013 027 009 032 123 076 098 054 087 

思路分析

  • 题目重点
    • 将最小的结点移动到链表的最前端
    • 不得申请新的接结点
尝试一
  • 主要分为两步:
    • 找到最小的结点

在这里插入图片描述

  • 移动到整个序列的最前面,涉及到断点和切片

在这里插入图片描述

伪代码(是 ——伪代码)

LinkNode<ElemType> *LinkList<ElemType>::getTail() {
    LinkNode<ElemType> *temp = head;
    while(temp->next) {
        temp = temp->next;
    }
    return temp;
}

template<class ElemType>
void Linklist_MoveMinToFirst( LinkList<ElemType> &A ) {
    LinkNode *temp = A.GetHead();
    *minIndex = A.GetHead();
    
    //find the index of minElement
    while(temp->next) {
        if(temp->next->data < minIndex->next->data) {
            minIndex = temp;
        }
        temp = temp->next;

    }

	//change the node to the eligible place
    LinkNode *temp3 = minIndex->next;
    if(minIndex != A.GetHead()->next)
    {
        //move the minium element to the start of the sequence
        minIndex->next = minIndex->next->next;
        temp3->next = A.GetHead()->next;
        A.GetHead()->next = temp3;
    }

    //move other miniums to the first
    LinkNode *temp2 = NULL;
    temp = A.GetHead()->next;
     while(temp->next) {
        if(temp->next->data == temp3->data)
        {

            temp2 = temp->next;
            temp->next = temp->next->next;
            temp2->next = A.GetHead()->next;
            A.GetHead()->next = temp2;
        }
        else
        {
            temp = temp->next;
        }
    }

}

车祸现场

在这里插入图片描述

  • 出现这个原因,个人猜测还是使用了int输出了 ,但是我细看仍旧是string ,没有错。于是乎分别试了试输入字符和字符串
  • 字符:是成功的
    在这里插入图片描述
  • 字符串:不成功,而且没有输出?
    在这里插入图片描述
  • 分析:有输入了一次,好像可以,为什么刚才不对
    在这里插入图片描述
  • 好吧,既然不是字符串的问题,仔细看,发现只要是最小已经在第一个了,程序就不能正常完成

在这里插入图片描述

  • 又试了数字,发现确实不行
    在这里插入图片描述
  • 分析原因:第二步移动结点没有进行判定,如果一直是第一个结点,没有任何的改变,那就不用发生改变,所以加一个判定条件就行了
    在这里插入图片描述
  • 提交之后,发现并没有任何的改变,还是相关案例没有通过。我能想到的类别:不同的数据类型(试过了),最小值在首尾两个地方(试过了),多个最小值(没试)
    在这里插入图片描述
  • 多个最小值:分别实验了两种,这两种都有两个最小值,毫无例外都只是把第一个最小值放在序列的最前端,而没有将其他的放在最前端,所以需要考虑:将所有的最小值都移动到最前端

在这里插入图片描述
在这里插入图片描述

修改:在找到最小结点情况下,再去遍历整个链表,将和最小的结点都相同的结点都移动到最前面

在这里插入图片描述

  • 程序陷入了死循环
  • 原因如下:当遍历到相等的结点时,移动之后,仍旧进行循环迭代,引用了空的空间。加上一个else条件即可
    在这里插入图片描述
修改提交后

在这里插入图片描述

  • 这已经不在能力范围了,我分析不出来,放弃,看答案
    在这里插入图片描述
  • 比较不信,自己跑了一遍

在这里插入图片描述

  • 分析:居然就是普通的字符串,难道是之前的字符串没有处理好?
  • 结果:这就很扯淡,自己之前举得例子刚好第一个极小值就是最小值,其实我是写错了,将极小值看成了最小值,循环判定加了一个break;
    在这里插入图片描述
修改之后在提交

在这里插入图片描述

分析与总结

  • 既然乏了,腻了,那就不要再写了,写的都是什么东西,自己疯狂debug累不累?真的服了自己。
  • 这次找的问题自己都匪夷所思,感觉错的和做梦一样。
  • 其实不仅仅是状态不好,关键是图一开始就画错了,导致你的结点就错了。在这里插入图片描述
    有事请加个人扣扣联系,651378276
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页

打赏

客院载论

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者