覆盖变量

时间:2016-12-02 09:48:12

标签: 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,程序并没有真正创建新的节点对象。而是变量名称&#34; newNode&#34;仍指向存储在其中的值为5的节点,并将其替换为值为6的节点。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

node* newNode = new node(value);

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

相关问题