链接列表错误 - 为什么头部和尾部引用指向同一地址?

时间:2017-09-22 07:02:46

标签: c++ pointers linked-list

在使用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时它们不再存在。为什么会这样?

1 个答案:

答案 0 :(得分:2)

问题是你的第一个版本的代码LinkedNode node = {element, 0}; ... head = &node;存储了一个局部变量的地址,一旦insert - 函数完成,它就会变为无效。一旦您稍后访问此指针(例如,遍历列表时),这将导致未定义的行为。

在第二个版本中,使用LinkedNode* node = new LinkedNode;,您可以动态分配内存,并且在您明确删除它之前,此类对象才有效。因此,指针保持有效,您可以稍后访问它。