2011-10-13 106 views
0
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的合法内存地址,没有“next”或“prev”,但“ptr”指针指向地址0xcccccc,而不是头的地址?我真的很困惑,我以为我理解指针!C++链表帮助(指针)?

+0

通常,0xcccccc是调试器告诉你指向的内存是未初始化的垃圾。如果调试器是正确的,由于ptr = head是正确的,错误在循环中。 ptr在ptr = ptr-> next后变成垃圾。所以不知怎的,连锁店出现了一个错误。 – VoidStar

回答

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; 
+0

是的,这绝对是问题所在。堆是最好的通用方法,但不要忘记仔细考虑节点将如何全部删除〜LinkedList ()!确保不要让列表被操纵,以至于任何节点变成“孤立的”,否则你将有内存泄漏。 – VoidStar

1

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

分配新如上图所示的元素,但不要忘了收拾,当你从列表(删除指针)删除元素。