C++链表帮助(指针)?

use*_*668 0 c++ pointers linked-list list

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;
}
Run Code Online (Sandbox Code Playgroud)

这是我的链表系统的片段.问题是它在指示的行上引发错误.调试器说"head"指针指向一个没有"next"或"prev"的LinkedNode的合法内存地址,但是"ptr"指针指向地址0xcccccc,而不是head的地址?我真的很困惑,我以为我理解了指针!

K-b*_*llo 5

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

temp是自动存储的变量,它的生命周期将在addFront函数返回后立即结束,并且您将获得指向无效对象的指针.您必须在堆中分配节点,而是执行此操作:

    LinkedNode<T>* temp = new LinkedNode<T>;
    temp->data = d;
    ...
    head = temp;
Run Code Online (Sandbox Code Playgroud)