无法检测无限循环的原因
Can't detect the cause for the infinite loop
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);
}
};
main.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和tailer是一样的,如果你处理得当的话。但是在如果你将 prevnode 设置为他自己的 tailer 的 prevnode 之后,这会创建一个循环。
之后的行也创建了这个自循环。
修复这些行,它应该可以工作。我总是把这些东西画在纸上,让它们更清晰:)
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 语句,它工作正常!
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);
}
};
main.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和tailer是一样的,如果你处理得当的话。但是在如果你将 prevnode 设置为他自己的 tailer 的 prevnode 之后,这会创建一个循环。 之后的行也创建了这个自循环。
修复这些行,它应该可以工作。我总是把这些东西画在纸上,让它们更清晰:)
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 语句,它工作正常!