【问题标题】:Queue not correctly inserting pointers队列未正确插入指针
【发布时间】: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 stuffyet more stuff 中的任何内容都不会执行,因为 front_node 要么是 nullptr 要么不是,没有其他选择。
  • 您遗漏了重要内容的一个线索:您从未将next_node 设置为任何内容。另一个有用的花絮:跟踪back_node 的目的是让您在插入函数中不需要循环。试着画出包含几个元素的队列,勾勒出插入过程中应该发生的事情,然后以此为指导重写你的代码。

标签: c++ visual-c++ queue


【解决方案1】:

这是另一个使用循环机制的插入。

void insert()
{
    Node * NewNode = new Node{};
    NewNode->value = number;

    if (front_node == nullptr)
    {
        front_node = NewNode;
        back_node = NewNode;
        return;
    }

    Node* node = nullptr;
    for (node = front_node; node->next_node != nullptr; node = node->next_node);

    node->next_node = NewNode;
    NewNode->previous_node = node;
    NewNode->next_node = nullptr;
    back_node = NewNode;
}

享受...:)

现在使用 back_node 指针来提高足够长的队列的效率。

void insert(int number) {
    Node * NewNode = new Node{};
    NewNode->value = number;

    if (front_node == nullptr)
    {
        front_node = NewNode;
        back_node = NewNode;
        return;
    }

    Node* node = back_node;
    node->next_node = NewNode;
    back_node = NewNode;
    back_node->previous_node = node;
}

这样更好---;)

【讨论】:

    【解决方案2】:

    正确的插入方法是:

    void insert(int number) {
        Node *NewNode = new Node{};
        NewNode->value = number;
        if (front_node == nullptr) {
            NewNode->previous_node = nullptr;
            front_node = NewNode;
        }
        else{
            NewNode->previous_node = back_node;    
            back_node->next_node = NewNode;
        }
        back_node = NewNode;
    }
    

    首先我检查front_node 是否为空,如果是-NewNode 是第一个节点,也是最后一个节点。否则,我们应该在 back_node(back_node 的 next_node)之后添加 Node。不要忘记更新previous_nodeback_nodenext_node。然后将back_node设置为NewNode

    【讨论】:

    • 我仍然得到一个 nullptr。
    • front_node 是 first_node,first 之前没有节点(我认为)。就像最后一个节点的next_node 是nullptr。
    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2019-11-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多