覆盖变量的链表问题
Linked list issue with overwriting variables
我正在尝试用 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
时,程序会创建一个名为新节点的节点,然后完美地附加该节点。
接下来会发生什么,当要附加第二个数字时,比方说 6
,程序并没有真正创建新的节点对象。相反,变量名称 "newNode" 仍然引用其中存储了值 5
的节点,并将其替换为具有值 6
的节点。
这可以理解地创建了一个无限循环,因为它本质上使数组循环。我不知道如何解决这个问题。有人能指出我正确的方向吗?
PS:对不起,如果这非常简单,我是 C++ 的新手(这只是我编码的第二天)
在linkedList::appendElement(int value)
中你在栈上创建了一个新节点(或'automatic storage'),这意味着当函数returns.
时节点将被销毁
相反,使用 new
运算符在堆(或 'dynamic storage' )上创建节点,这样它就不会在函数 returns.
时被销毁
node* newNode = new node(value);
您还必须记住在列表被销毁或截断时自行销毁节点,大多数 C++ 开发人员很快发现为此使用智能指针更好。
我正在尝试用 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
时,程序会创建一个名为新节点的节点,然后完美地附加该节点。
接下来会发生什么,当要附加第二个数字时,比方说 6
,程序并没有真正创建新的节点对象。相反,变量名称 "newNode" 仍然引用其中存储了值 5
的节点,并将其替换为具有值 6
的节点。
这可以理解地创建了一个无限循环,因为它本质上使数组循环。我不知道如何解决这个问题。有人能指出我正确的方向吗?
PS:对不起,如果这非常简单,我是 C++ 的新手(这只是我编码的第二天)
在linkedList::appendElement(int value)
中你在栈上创建了一个新节点(或'automatic storage'),这意味着当函数returns.
相反,使用 new
运算符在堆(或 'dynamic storage' )上创建节点,这样它就不会在函数 returns.
node* newNode = new node(value);
您还必须记住在列表被销毁或截断时自行销毁节点,大多数 C++ 开发人员很快发现为此使用智能指针更好。