2012-04-06 68 views
1

我一直在試圖寫一個最短路徑算法,dijkstras算法,找到前兩個頂點的最短路徑工作得很好。我試圖清除鏈表和優先級隊列時遇到問題。我將如何清除鏈接列表?

class llNode { 
public: 
    int id; 
    int source; 
    int weight; 
    llNode* next; 
    llNode(int key, int distance, int from) { 
     id=key; 
     weight=distance; 
     source=from; 
     next = NULL; 
    } 
}; 


class lList { 
private: 
    llNode* root; 
    llNode* end; 

    void clearAll(llNode* toClear); 


public: 
    lList() { 
     root = NULL; 
    } 

    void add(llNode* toAdd) { 
     if (root == NULL) { 
      root = toAdd; 
      end = toAdd; 
      return; 
     } 

     end->next = toAdd; 
     end=end->next; 
    } 

    bool isFound(int key) { 
     for(llNode* ii= root; ii != NULL ; ii=ii->next) { 
      if (ii->id == key) { 
       return true; 
      } 
     } 

     return false; 
    } 

    void clearAll(); 

}; 

void lList::clearAll() { 
clearAll(root); 
} 

void lList::clearAll(llNode* toClear) { 
if(toClear == NULL) { 
    return; 
} 

clearAll(toClear->next); 

toClear=NULL; 

} 

除了這些明確的方法,我想簡單地設置根爲NULL,我也試圖通過列表遍歷和使用各元素刪除。我需要運用這些方法中的任何一種。 Root始終設置爲無效位置,並且出現訪問衝突錯誤。

有沒有簡單的東西,我只是沒有看到?我將如何去刪除鏈接列表中的每個元素?

+0

既然你正在處理指針,你可以讓'root.next'和'end.next'都指向'root'。 – 2012-04-06 21:22:32

回答

5

你需要去對每個元素,並將其刪除 僞碼

Set pointer to root 
While(pointer !=null) 
{ 
    temp=pointer->next; 
    delete[] pointer; 
    pointer = temp; 
} 
+0

錯字?你的意思是'pointer = temp-> next'? – 2012-04-06 21:24:58

+0

@HunterMcMillen yup謝謝 – Pepe 2012-04-06 21:25:28

+1

請記住,您將一個指針指定給temp,然後刪除該指針。 – 2012-04-06 21:27:31

-2

設置rootNULL會刪除整個列表。

void lList::clearAll() { 
    root = NULL; 
} 

你說你試過這個。在這種情況下,您的訪問違例如何發生?

注意:我的代碼可能包含內存泄漏!您可能會想要遍歷列表並取消分配每個項目,除非使用其他某種機制恢復內存。

+0

如何將root設置爲NULL刪除列表! – Pepe 2012-04-06 21:32:58

+0

它使列表爲空。正如'isFound'中的任何輸入都會返回'false'。 – 2012-04-06 21:35:55

+6

這絕對是錯誤的答案。你只留下指針和內存泄漏以及各種討厭的東西,只是失去對列表根目錄的引用,更別說「刪除」這個詞是不正確的。您更精確地丟失了您的列表 – devshorts 2012-04-06 21:36:41