【发布时间】:2018-06-02 18:11:21
【问题描述】:
我正在尝试在 C++ 中重新创建一个队列,但无法正确插入指针。看看
#include "stdafx.h"
#include <iostream>
using namespace std;
class Node {
public:
int value;
Node * next_node = nullptr;
Node * previous_node = nullptr;
};
class Queue {
public:
Node * front_node = nullptr;
Node * back_node = nullptr;
void insert(int number) {
Node * NewNode = new Node{};
NewNode->value = number;
if (front_node == nullptr) {
front_node = NewNode;
}
else if (back_node == nullptr) {
back_node = NewNode;
}
else if (front_node->previous_node == nullptr) {
front_node->previous_node = back_node;
back_node = NewNode;
}
else {
Node * temp_node = new Node{};
temp_node = front_node->previous_node;
while (1 == 1) {
if (temp_node->previous_node == nullptr) {
temp_node->previous_node = back_node;
back_node = NewNode;
break;
}
else {
temp_node = temp_node->previous_node;
}
}
}
}
int deque() {
if (front_node == nullptr) {
if (back_node != nullptr) {
int return_value = back_node->value;
back_node = nullptr;
return return_value;
}
return 0;
}
else {
int return_value = front_node->value;
front_node = front_node->previous_node;
return return_value;
}
}
};
int main()
{
Queue queue;
queue.insert(10);
queue.insert(9);
queue.insert(8);
queue.insert(7);
queue.insert(6);
cout << queue.deque() << endl;
cout << queue.deque() << endl;
cout << queue.deque() << endl;
cout << queue.deque() << endl;
cout << queue.deque() << endl;
system("PAUSE");
return 0;
}
根据 insert 函数,front_node 是一个 nullptr,因此第一个节点将被插入那里并且结果是正确的。接下来是后节点,结果很好而且花花公子。当涉及到第三个节点时,我将后节点指针插入到前节点前一个指针中,将新节点插入到 back_node 指针中。新节点确实被放入后节点,但前节点->previous_node 指针作为空指针出现。
编辑 1:我将 if 从 front_node != nullptr 更改为 front_node != nullptr 和 back_node == nullptr。它似乎仍然没有插入到 front_node 上一个节点
编辑 2:我接受了重写它的建议,现在我让插入函数正常工作,但现在 dequeing 似乎在第三个 deque 上失控了一次。
编辑3:我的最后一个错误是我没有使用front_node->previous_node = back_node,而是使用了front_node = back_node。感谢所有提供帮助的人。
【问题讨论】:
-
好吧,你有
if (front_node == nullptr) { do stuff } else if (front_node != nullptr) {do other stuff} else yet more stuff。yet more stuff中的任何内容都不会执行,因为 front_node 要么是 nullptr 要么不是,没有其他选择。 -
您遗漏了重要内容的一个线索:您从未将
next_node设置为任何内容。另一个有用的花絮:跟踪back_node的目的是让您在插入函数中不需要循环。试着画出包含几个元素的队列,勾勒出插入过程中应该发生的事情,然后以此为指导重写你的代码。
标签: c++ visual-c++ queue