2017-06-30 3 views
2

Das unten stehende Programm wird verwendet, um die Duplikate aus einer sortierten, einfach verknüpften Liste zu entfernen. Der Code gibt Garbage-Werte in der Online-IDE an. Aber wenn ich die Zeile kommentiere.Derselbe Code gibt unterschiedliche Ergebnisse in der Online-IDE und der lokalen IDE.

Das Programm funktioniert gut in Online-IDE selbst. Hier ist die Funktion, die ich geschrieben habe. Die anderen Teile des Codes sind vom Online-Judge klar definiert (nicht von mir).

Und auch der Code ohne Kommentar die Zeile löschen curr; funktioniert gut in lokalen IDE (Codeblocks).

volles Programm:http://ideone.com/9bHab0

Warum erhalte ich den Müll Werte?

Node *removeDuplicates(Node *root) 
{ 
// your code goes here 
    struct Node* curr = root,*prev = NULL; 
    while(curr) 
    { 
     if(prev==NULL) 
      prev = curr; 
     else if(curr->data!=prev->data) 
      prev = curr; 
     else 
     { 
      prev->next = curr->next; 
      delete curr; 
      curr = prev->next; 
     } 
    } 
    return root; 
} 

EDIT: Man könnte den Zeiger, dessen Standort gelöscht wird, wird sofort neu vergeben. Also könnte hier kein fliegender Zeiger sein!

+0

Haben Sie versucht, es unter einem Debugger auszuführen? –

+0

Sie * do * Ihre 'Node'-Instanzen mit' new' zuweisen? *Alle von ihnen? Was machen ihre Destruktoren? –

+1

Das ist eine glückliche Mischung aus C ('struct Node * curr}) und C++ (' delete curr}) Code. Sind Sie sicher, dass der Aufrufer C++ ist und "operator new" aufruft, um Instanzen zuzuordnen? – IInspectable

Antwort

4

Nehmen wir ein sehr einfaches Beispiel mit einer Zwei-Knoten-Liste, wo Sie z.B.

node1 -> node2 

Mit der ersten Iteration dann ist prevNULL so prev = curr Sie tun. Jetzt zeigt curr und prev auf den gleichen Knoten.

, die in der zweiten Iteration bedeutet, dass beide if Bedingungen falsch sind (prev != NULL und curr->data == prev->data) Sie gehen in die else Teil, wo Sie

prev->next = curr->next; 
delete curr; 
curr = prev->next; 

Hier haben Sie delete currabercurr auf die zeigt gleicher Speicher wie prev, führt zu undefined Verhalten in der Zuordnung curr = prev->next, wie Sie jetzt den Streuzeiger dererenzieren prev.

Erschwerend kommt hinzu, geben Sie dann eine dritten Iteration wo prev noch zu dem gelöschten ersten Knoten zeigen wird und wieder dereferenzieren die ungültigen prev Zeiger (in Ihrem zweiten if Zustand) und Sie wieder in dem Ende else Teil, wo Sie die ungültige Dereferenzierung fortsetzen. Und so weiter in der Unendlichkeit (oder du stürzt ab).

+2

Und die Lösung ist: Ersetzen Sie 'prev = curr;' mit 'prev = curr; curr = curr-> next; 'in den ersten beiden bedingten Zweigen. – IInspectable

+0

Hinzufügen von ** curr = curr-> next ** zum ** wenn Teil und sonst wenn Teil ** löste das Problem. Danke für die Lösung. Sollte ich den Header der Frage ändern, um unerwünschte Aufmerksamkeit gegenüber dieser Frage zu vermeiden? –

Verwandte Themen