2016-11-18 5 views
0

Ich versuche, Funktion zum Löschen von Knoten in doppelt verketteten Liste zu schreiben. Aber ich staple auf der ersten Bedingung, wo nodeToDelete auch Kopf ist. wenn ich diesen Code frei benutze (nodeToDelete) dont free nodeToDeleteBut nodeToDelete-> nextNode;kann nicht Knoten in doppelt verkettete Liste in C++ freigeben

Hilfe?

bearbeitet: mit Lösch nicht auch Screenshot sehen arbeiten ->https://s22.postimg.org/dff43kn9d/slide.jpg

bearbeiten


void deleteNode(node *&head, int value) 

meinen Code beheben DANKE.


void deleteNode(node *head, int value) 
{ 
    node* nodeToDelete = head; 

    while(nodeToDelete != NULL) 
    { 
     if(nodeToDelete->value == value) 
     { 
      if(nodeToDelete == head) 
      { 
       head = nodeToDelete->nextNode; 
       head->previousNode = NULL; 
       delete nodeToDelete; 
       return; 
      } 

     } 

     nodeToDelete = nodeToDelete->nextNode; 
    } 
} 
+2

Sie sollten wirklich werden mit 'new' und' delete' in C++, wenn Sie die manuelle Speicherzuweisung zu tun haben. 'malloc' und' free' funktionieren nicht mit nicht standardmäßigen Layout-Klassen in C++. – NathanOliver

+0

Erfahren Sie, wie Sie einen Debugger verwenden und wie Sie Code Zeile für Zeile durchgehen. –

+0

Oh Mann !! Danke !!! Ich benutze neu für die Speicherzuweisung. Sollte verwenden, löschen Sie kostenlos. – pZCZ

Antwort

1

Wenn Kopf-> Wert Streichhölzer, Sie ändern Kopf in dieser Funktion, aber das wird der Kopf nicht an anderer Stelle ändern. Der Aufrufer hat jetzt einen ungültigen Zeiger auf einen gelöschten Knoten und keine Möglichkeit, die tatsächlichen Knoten zu finden. Es ist wahrscheinlich dieser ungültige Zeiger, der dazu führt, dass ein späterer Aufruf fehlschlägt.

Auch, wenn Kopf-> Wert nicht übereinstimmt, dann durchsuchen Sie die Liste, aber weigern Sie sich, etwas später damit zu tun, weil es nicht Kopf ist. Es gibt keine andere Klausel.

+0

Vielen Dank für Ihren Kommentar. Ich repariere meinen Code. Ich sollte Kopf nach Reference nur hinzufügen, um zu funktionieren und seine Arbeit. – pZCZ

2

Sie haben eine falsche Reihenfolge der Schritte. Ich zeichnete eine schnelle Skizze mit Knoten und Zeigern und hier ist was ich gefunden habe:

Zuerst starten Sie mit zwei Zeigern: head und nodeToDelete, die beide auf den Knoten zeigen, den Sie löschen möchten. Dann zeigen Sie mit dem Kopf zum nächsten Knoten und löschen den Zeiger auf den vorhergehenden Knoten und fahren mit dem Löschen von nodeToDelete fort. Bis jetzt kein Problem.

aber dann diese Zeile: nodeToDelete = nodeToDelete->nextNode; ist problematisch.

Da nodeToDelete freigegeben wurde, können Sie es nicht mehr verwenden und die Logik selbst funktioniert nicht.

Ich denke, die Logik zu folgen ist:

  1. Punkt Kopf zum nächsten Knoten.

  2. Make Kopf-> vorheriger Punkt zu nodeToDelete-> voriger

  3. Fabrikat nodeToDelete-> nächster Punkt Kopf

  4. nodeToDelete löschen

Auf diese Weise werden bei Ihnen die vorherigen zeigen Sie auf die nächste, die nächste auf die vorherige und die dazwischen.

Etwas wie:

head = nodeToDelete->next; 
head->previous = nodeToDelete->previous; 
nodeToDelete->next = head; 
delete(nodeToDelete); 

while(nodeToDelete != NULL) nicht notwendig ist, können Sie mit einem if überprüfen, ob Sie wollen, aber diese Schleife ist keine gute Idee.

Hier ist eine herrliche Zeichnung, die ich gemacht habe, vielleicht wird es ein wenig helfen. Sorry, ich bin wirklich schlecht ...

enter image description here

Verwandte Themen