【发布时间】:2021-01-05 07:32:55
【问题描述】:
以下是C++编写的带有Node类和main函数的链表。 List 正在使用“next()”函数向前遍历,但在使用“back()”向后遍历时会产生执行时间错误。
#include <iostream>
using namespace std;
class Node {
public:
int object;
Node *nextNode;
Node *prevNode;
public:
int get(){
return object;
}
void set(int object){
this->object = object;
}
Node* getNext(){
return nextNode;
}
void setNext(Node *nextNode){
this->nextNode = nextNode;
}
Node* getPrev(){
return prevNode;
}
void setPrev(Node *prevNode){
this->prevNode = prevNode;
}
};
class List {
public:
Node* headNode;
Node* currentNode;
int size;
public:
List(){
headNode = new Node();
headNode->setNext(NULL);
headNode->setPrev(NULL);
currentNode = NULL;
int size = 0;
}
void add(int addObject){
Node* newNode = new Node();
newNode->set(addObject);
if(currentNode != NULL){
newNode->setNext(currentNode->getNext());
newNode->setPrev(currentNode);
currentNode->setNext(newNode);
currentNode = newNode;
}
else {
newNode->setNext(NULL);
newNode->setPrev(headNode);
headNode->setNext(newNode);
currentNode = newNode;
}
size++;
}
int get(){
if(currentNode != NULL) {
return currentNode->get();
}
}
bool next(){
if(currentNode == NULL) return false;
currentNode = currentNode->getNext();
if(currentNode == NULL) return false;
else return true;
}
bool back(){
if(currentNode == NULL) return false;
currentNode = currentNode->getPrev();
if(currentNode == NULL) return false;
else return true;
}
void start(){
currentNode = headNode;
}
void remove() {
if (currentNode != NULL && currentNode != headNode){
delete currentNode;
size--;
}
}
int length() {
return size;
}
};
int main(){
List list;
list.add(5);
list.add(13);
list.add(4);
list.add(8);
list.add(48);
list.add(12);
list.start();
while(list.next()){
cout<<endl<<"Element: " << list.get() << endl;
}
cout<<endl<<"BACK"<<endl;
while(list.back()){
cout<<endl<<"Element: " << list.get() << endl;
}
}
Back() 函数应该以相反的方向(从头到尾)遍历列表。反向方式。这段代码有时会挂起 CPU,有时只运行 next() 函数,而对于 back() 函数,它保持沉默,不做任何事情。
【问题讨论】:
-
这可能与您的 get 函数在发生 Null 时不会返回任何内容的事实有关
-
您是否尝试调试代码并检查指针是否指向预期位置?
-
我尝试调试但可以找到它
-
在
add中插入新节点时,会更新current->next指针。但是你没有更新current->next->prev,所以反向结构永远不会正确形成。 -
@Asad Razaq 把那个糟糕的代码扔进垃圾桶然后重新重写列表实现。:)
标签: c++ algorithm data-structures linked-list