关于双链表的反向迭代(逆序输出) -- bug

今天尝试写一个双链表,写完之后试一下反向迭代,结果发现老是 输出为空,解决之后又有一个死循环,死循环解决之后又总是最后一个输出为垃圾数。以下是解决的思路

先分享已解决之后的源码

主函数和头文件部分不变

#include "ChainTable.h"
int main(void)
{
    DoubleList testDouble;
    testDouble.display(testDouble.initChain_end());

    return 0;
}
#ifndef CHAINTABLE_2_CHAINTABLE_H
#define CHAINTABLE_2_CHAINTABLE_H
#include <iostream>
using namespace std;
struct Node{
    int data;
    Node *next;
};

struct doubleNode{
    int data;
    doubleNode *prior;
    doubleNode *next;
};
class DoubleList{
private:

public:
    doubleNode *initChain_end();
    doubleNode *initChain_head();

    void display(doubleNode *head);
    void Redisplay(doubleNode *head);
};
#endif //CHAINTABLE_2_CHAINTABLE_H

方法函数

#include "ChainTable.h"

doubleNode *DoubleList::initChain_end() {
    auto *head = new doubleNode;
    head ->next = nullptr;//少写则异常输出
    head ->prior = nullptr;//少写则异常输出
    auto prev = head;
    cout << "How many?";
    int num;
    cin >> num;
    for (int i = 0; i < num; ++i) {
        auto temp = new doubleNode;
        temp ->data = i;
        prev ->next = temp;
        temp ->prior = prev;
        prev = temp;
        temp ->next = nullptr;//少写则异常输出
    }
    while(head ->next != nullptr)
        head = head ->next;
    return head ;
}

void DoubleList::display(doubleNode *head) {

    auto cur = head;
    while (cur ->prior){
        cout << cur -> data << " ";
        cur = cur -> prior;
    }
}

输出为空

在方法部分,我一开始在19行写的是

while(head )
        head = head ->next;
    return head ;

这样写的话head最后会直接指向nullptr,在display函数哪里一判断,发现是nullptr,直接就不进行输出了

死循环

问题出在第五行和第六行

我display函数的判断结束条件是cur为nullptr,因为它是向前迭代的,如果我没有第6行,那指到头指针的时候就没有nullptr于是就会死循环 -- 没有判断结束条件

垃圾数

一开始我在display函数的输出是这样写的

while (cur){
        cout << cur -> data << " ";
        cur = cur -> prior;
    }

如果这样写,循环会一直进行到头指针的位置,我们知道头指针是不储存数据的,所以这里我就思考,垃圾数大概率都和头指针输出有关,而且我注意到,此时代码还是正常退出,证明该节点存在,不过是个哑结点,所以直接把循环条件改成当cur指向的下一个为nullptr即可!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值