【问题标题】:Can't detect the cause for the infinite loop无法检测到无限循环的原因
【发布时间】:2015-12-11 08:28:20
【问题描述】:

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;
}

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

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

【问题讨论】:

  • 在 printRev() 的 while 循环中,标头未初始化。
  • 我认为您需要做的就是在add 中的if 末尾添加return - 当列表为空时,您已经处理了添加节点的情况,无需继续(这会导致循环,因为tailer-&gt;getPrevNode() == tempNode

标签: list loops infinite


【解决方案1】:

这里出错了

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

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

如果你添加第一个节点,header 和 tailer 是一样的,如果你正确处理的话。但是在如果你将prevnode设置为tailer的prevnode之后,它就是他自己,这会创建一个循环。 之后的行也创建了这个自循环。

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

【讨论】:

  • 感谢指出缺陷!我知道现在有什么问题:)
【解决方案2】:
    if (header->getNextNode() == tailer)
    {
        header->setNextNode(tempNode);
        tailer->setPrevNode(tempNode);
        tempNode->setNextNode(tailer);
        tempNode->setPrevNode(header);
    }
    else
    {
        tempNode->setPrevNode(tailer->getPrevNode());

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

        tempNode->setNextNode(tailer);
    }

刚刚添加了一个 else 语句,它工作正常!

【讨论】:

    猜你喜欢
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    相关资源
    最近更新 更多