c++链表帮助(指针)

C++ linked list help (pointers)?

本文关键字:指针 帮助 链表 c++      更新时间:2023-10-16
template <typename T>
class LinkedNode
{
public:
    T data;
    LinkedNode<T> *next;
    LinkedNode<T> *prev;
    LinkedNode<T>();
    LinkedNode<T>(T);
};
// Default constructor
template <typename T>
LinkedNode<T>::LinkedNode()
{
    next = NULL;
    prev = NULL;
}

template <typename T>
class LinkedList
{
private:
    LinkedNode<T> *head;
public:
    LinkedList<T>();
    ~LinkedList<T>();
    void addFront(T);
    void addBack(T);
    void addAt(T, int);
    void removeFront();
    void removeBack();
    void removeAt(int);
    void printList();
};
// Constructor
template <typename T>
LinkedList<T>::LinkedList()
{
    head = NULL;
}
// Add new node to front
template <typename T>
void LinkedList<T>::addFront(T d)
{
    LinkedNode<T> temp;
    temp.data = d;
    if (head == NULL)
    {
        head = &temp;
    }
    else
    {
        temp.next = head;
        head->prev = &temp;
        head = &temp;
    }
}
// Add new node to back
template <typename T>
void LinkedList<T>::addBack(T d)
{
    // Find the back of this list
    LinkedNode<T> *ptr;
    ptr = head;
    while (ptr->next != NULL) // <------- DIES HERE, MEMORY ACCESS VIOLATION
    {
        ptr = ptr->next;
    }
    // Make a new node and join it to the back
    LinkedNode<T> temp;
    temp.data = d;
    temp.prev = ptr;
    ptr->next = &temp;
}

这是我的链表系统的一个片段。问题是它会在指定的行上抛出错误。调试器说,"头"指针指向LinkedNode的合法内存地址,没有"下一个"或"prev",但"ptr"指针指向地址0xcccccc,而不是头的地址?我真的很困惑,我以为我懂指针!

void LinkedList<T>::addFront(T d)
{
    LinkedNode<T> temp;
    temp.data = d;
    ...
    head = &temp;
    ...
}

temp是一个自动存储的变量,一旦addFront函数返回,它的生命周期就会结束,你将得到一个指向无效对象的指针。您必须在堆中分配节点,请这样做:

    LinkedNode<T>* temp = new LinkedNode<T>;
    temp->data = d;
    ...
    head = temp;

我确认了K-ballo的答案。问题是,当addFront函数离开其作用域时,您添加的对象将被销毁。你得到的是一个无效指针的列表。

如上所示用new分配元素,但不要忘记在从列表中删除元素时进行清理(删除指针)。