list - 无法检测无限循环的原因

标签 list loops infinite

List.h

#pragma once
#include "Node.h"

using namespace std;

class List
{
protected:
Node *header;
Node *tailer;

public:
List()
{
    initList();
}

void add(string str)
{
    Node *tempNode = new Node();
    tempNode->setString(str);

    if (header->getNextNode() == tailer)
    {
        header->setNextNode(tempNode);
        tailer->setPrevNode(tempNode);
        tempNode->setNextNode(tailer);
        tempNode->setPrevNode(header);
    }

    tempNode->setPrevNode(tailer->getPrevNode());

    tailer->getPrevNode()->setNextNode(tempNode);
    tailer->setPrevNode(tempNode);

    tempNode->setNextNode(tailer);


}

virtual void printAll()
{
    Node *tempNode = header->getNextNode();

    while (tempNode != tailer)
    {
        cout << tempNode->getString() << endl;
        tempNode = tempNode->getNextNode();
    }
}



void printRev()
{
    Node *tempNode = tailer->getPrevNode();

    while (tempNode != header)
    {
        cout << tempNode->getString() << endl;

        tempNode = tempNode->getPrevNode();
    }
}

void initList()
{
    header = new Node();
    tailer = new Node();
    header->setNextNode(tailer);
    tailer->setPrevNode(header);

}
};

ma​​in.cpp

#pragma once
#include <iostream>
#include <string>
#include "List.h"
#include "Node.h"

using namespace std;


int main()
{
List list1;

list1.add("A");
list1.add("B");
list1.add("C");
list1.add("D");

//list1.printAll();

list1.printRev();

system("PAUSE");
return 0;
}

所以,这是我对链表的小实现。 我尝试添加节点并打印出所有节点,效果很好。 但一旦我尝试以相反的顺序打印节点,我的程序就会进入无限循环。

谁能告诉我我做错了什么?

最佳答案

这里出了问题

tempNode->setPrevNode(tailer->getPrevNode());

tailer->getPrevNode()->setNextNode(tempNode);
tailer->setPrevNode(tempNode);

如果添加第一个节点,如果处理正确,则 header 和尾部是相同的。但是,如果将 prevnode 设置为 tailer 的 prevnode(即他自己),这会创建一个循环。 之后的行也创建了这个自循环。

修复这些行,它应该可以工作。我总是把这些东西画在纸上以使它们更清晰:)

关于list - 无法检测无限循环的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32580018/

相关文章:

java - while(Matcher.find()) 无限循环

c# - 在C#中,每次都会评估循环声明吗?

javascript - 是否可以不限制字符重复的正则表达式范围的上限值(无限)?

android - 无限播放音乐,直到点击一个按钮

jQuery 返回选择列表中的第一个匹配项

python - 如何在不创建新列表的情况下访问python中的嵌套列表项?

java - 在java中存储文本文档: memory usage

javascript - 如何将 case 语句放入 javascript 循环中

C# 将 linq 列表 (int) 项更改为 (string)

python - 无限 While 循环 - 内存使用?