2012-04-06 5 views
1

Ich habe versucht, einen Algorithmus für den kürzesten Weg, Dijkstras-Algorithmus zu schreiben, die Suche nach dem kürzesten Pfad für die ersten beiden Ecken funktioniert gut. Ich stoße auf das Problem, während ich versuche, eine verknüpfte Liste und eine Prioritätswarteschlange zu löschen.Wie würde ich eine verknüpfte Liste löschen?

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; 

} 

Zusammen mit diesen klaren Methoden, die ich versuchte, einfach root auf NULL gesetzt und ich habe auch versucht, durch die Liste durchlaufen und für jedes Element die gelöscht wurde. Ich habe Glück mit einer dieser Methoden. Root wird weiterhin auf einen ungültigen Speicherort festgelegt und ich erhalte Zugriffsverletzungsfehler.

Gibt es etwas einfaches, das ich gerade nicht sehe? Wie würde ich jedes Element aus einer verknüpften Liste löschen?

+0

Da Sie mit Zeigern zu tun haben, könnten Sie einfach die 'root.next' und' end.next' beide auf den 'root' zeigen. –

Antwort

5

Sie müssen über jedes Element gehen und es Pseudo-Code

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

Tippfehler? meinst du "pointer = temp-> next"? –

+0

@HunterMcMillen yup thanks – Pepe

+1

Denken Sie daran, dass Sie einen Zeiger auf Temp zuweisen, dann löschen Sie diesen Zeiger. –

-2

Einstellung root-NULL löschen wird die gesamte Liste löschen.

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

Sie sagten, Sie haben das versucht. Wie geschieht Ihre Zugriffsverletzung in diesem Szenario?

Vorsicht: mein Code enthält wahrscheinlich ein Speicherleck! Sie werden wahrscheinlich die Liste durchgehen und jedes Element freigeben müssen, es sei denn, ihr Speicher wird mithilfe eines anderen Mechanismus wiederhergestellt.

+0

Wie löscht das Setzen von root auf NULL die Liste! – Pepe

+0

Es macht die Liste leer. Wie in 'isFound' wird' false' für jede Eingabe zurückgegeben. –

+6

Das ist absolut die falsche Antwort. Sie haben hier hängende Zeiger und Speicherlecks und alle möglichen unangenehmen Dinge hinterlassen, indem Sie einen Verweis auf die Wurzel Ihrer Liste verloren haben, ganz zu schweigen von dem Wort "löschen", das nicht korrekt ist. Sie haben genauer gesagt Ihre Liste verloren – devshorts