2011-10-13 102 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函數離開其作用域時,添加的對象被銷燬。你有什麼是無效指針的列表。

分配新如上圖所示的元素,但不要忘了收拾,當你從列表(刪除指針)刪除元素。