c++ - 覆盖变量的链表问题

标签 c++ doubly-linked-list

我正在尝试用 C++ 编写链表代码,但遇到了问题。当我只插入一个项目时,它可以工作,但是当我插入多个项目时,它会进入无限循环。这是代码:

#include "linkedList.hpp"
#include <iostream>

linkedList::node::node(int value)
{
    internalValue = value;
    next = nullptr;
    previous = nullptr;
};

linkedList::linkedList()
: header{node(-2)}, trailer{node(-2)}
{
    trailer.previous = &header;
    header.next = &trailer;
    size = 0;
}

int linkedList::getLength()
{
    return size;
}

void linkedList::appendElement(int value)
{

    node newNode = node(value);
    newNode.next = &trailer;
    newNode.previous = trailer.previous;
    (trailer.previous)->next = &newNode;
    trailer.previous = &newNode;
    size = size + 1;
}

void linkedList::print()
{
    node * current = header.next;
    while (current -> next != nullptr)
    {
        std::cout << current -> internalValue << "->" << "\n";
        current = current->next;
    }
    std::cout << "v";
}

尝试调试后,发现问题出在节点的构建上。所以我第一次尝试插入 5 时,程序创建了一个名为 new node 的节点,然后完美地附加了它。

接下来会发生什么,当要附加第二个数字时,比方说 6,程序并没有真正创建一个新的节点对象。相反,变量名“newNode”仍然引用存储在其中的值为 5 的节点,并将其替换为值为 6 的节点。

这可以理解地创建了一个无限循环,因为它本质上使数组循环。我不知道如何解决这个问题。有人能指出我正确的方向吗?

PS:对不起,如果这非常简单,我是 C++ 的新手(这只是我编码的第二天)

最佳答案

linkedList::appendElement(int value) 中,您在堆栈上创建了一个新节点(或 'automatic storage'),这意味着该节点将在函数返回时被销毁。

相反,使用 new 运算符在堆(或 'dynamic storage')上创建节点,这样它就不会在函数返回时被销毁。

node* newNode = new node(value);

您还必须记住在列表被销毁或截断时自行销毁节点,大多数 C++ 开发人员很快发现为此使用智能指针更好。

关于c++ - 覆盖变量的链表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40929129/

相关文章:

c++ - 使用 C++/WinAPI/MFC 在编辑/文本框控件上捕获特殊的单击事件

Java:如何实现 Dancing Links 算法(使用 DoublyLinkedLists)?

c++ - 双向链表的复制构造函数

c++ - 堆栈和队列

c++ - 封闭循环变量的生命周期和范围是多少?

c++ - 完美转发到函数指针调用

c++ - 从 stringstream 中提取,从一个函数传递到另一个函数

c - 为什么我的双向链表的 C 实现会创建重复值?

java - add(index, element) 方法如何使用 LinkedList 在幕后工作?

c++ - 出队不适用于从双链表继承的队列类