在使用C ++实现链接列表的过程中,我遇到了一个问题,我的函数在列表的尾端插入了一个新元素。
struct LinkedNode
{
int data;
LinkedNode* next;
};
class LinkedList
{
private:
LinkedNode* head;
LinkedNode* tail;
int size;
public:
LinkedList();
void insert_back(int element);
int at(int index);
int length();
};
最初,我的insert_back函数如下:
void LinkedList::insert_back(int element)
{
LinkedNode node = {element, 0};
if(size == 0)
{
head = &node;
tail = head;
}
else
{
tail->next = &node;
tail = tail->next;
}
++size;
}
然而,当我遍历一个四元素列表时,打印出每个元素:
LinkedList myList;
myList.insert_back(5);
myList.insert_back(6);
myList.insert_back(7);
myList.insert_back(8);
for(int i = 0; i < myList.length(); ++i)
{
cout << myList.at(i) << endl;
}
首先打印列表中的最后一个元素,然后我会收到三个垃圾值,例如:
8
-403642776
-403642776
-403642776
我通过更改在insert_back中创建新节点的方式来修复此错误。这一次,我使用了new关键字。
void LinkedList::insert_back(int element)
{
LinkedNode* node = new LinkedNode;
node->data = element;
node->next = 0;
if(size == 0)
{
head = node;
tail = head;
}
else
{
tail->next = node;
tail = tail->next;
}
++size;
}
这解决了错误,但我真的不明白为什么。无论出于何种原因,在我的旧代码中,head和tail总是指向同一个地址,但是当我使用new时它们不再存在。为什么会这样?
答案 0 :(得分:2)
问题是你的第一个版本的代码LinkedNode node = {element, 0}; ... head = &node;
存储了一个局部变量的地址,一旦insert
- 函数完成,它就会变为无效。一旦您稍后访问此指针(例如,遍历列表时),这将导致未定义的行为。
在第二个版本中,使用LinkedNode* node = new LinkedNode;
,您可以动态分配内存,并且在您明确删除它之前,此类对象才有效。因此,指针保持有效,您可以稍后访问它。