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;
}
以下是我的链表系统的摘录。问题是它在指示的行上引发错误。调试器说“head”指针指向一个没有“next”或“prev”的LinkedNode的合法内存地址,但是“ptr”指针指向地址0xcccccc,而不是head的地址?我真的很困惑,我以为我理解指针!
答案 0 :(得分:5)
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;
答案 1 :(得分:1)
我确认了K-ballo的答案。 问题是当addFront函数离开其作用域时,您添加的对象将被销毁。你所拥有的是一个无效指针列表。
如上所示,使用new分配元素,但是当从列表中删除元素时,不要忘记清理(删除指针)。