我正在用cpp实现一个链接列表,以下代码有什么问题? 每次我进入函数--- AddToTail,“列表”都无法获得正确的值。它将其值更改为新构造的节点。
#include <iostream>
using namespace std;
struct Node
{
int value;
Node * next;
};
void AddToTail(Node* &list, int value)
{
Node newnode;
newnode.value = value;
newnode.next = NULL;
if (list == NULL)
list = &newnode;
else
{
Node * list1 = list;
while (list1->next != NULL)
{
list1 = list1->next;
}
list1->next = &newnode;
int a = 1;
}
}
int main()
{
Node *list=NULL;
AddToTail(list, 1);
AddToTail(list, 2);
AddToTail(list, 3);
while (list->next != NULL)
{
cout << list->value << endl;
list = list->next;
}
system("pause");
}
答案 0 :(得分:1)
void AddToTail(Node* &list, int value)
{
Node newnode;
// Set up fields of newnode.
// Store address of newnode into some other data structure.
}
这是你的问题。您正在堆栈上创建一个节点,该节点将在函数末尾超出范围。它似乎干扰后来的节点创建的原因是因为重新进入函数几乎肯定会在与前一次调用完全相同的地址创建newnode
。
如果您希望对象在功能范围内存活,您需要动态分配它们,例如:
void AddToTail (Node *&list, int value) {
Node *newnode = new Node(); // create on heap.
newnode->value = value; // set up node.
newnode->next = nullptr;
if (list == nullptr) { // list empty,
list = newnode; // just create.
return;
}
Node *lastNode = list; // find last item.
while (lastNode->next != nullptr)
lastNode = lastNode->next;
lastNode->next = newnode; // append to that.
}