2016-10-23 1 views
-4

Ich versuche, einen Knoten durch seine Position zu löschen, und der Zeilenlöschpunkt im folgenden Code verursacht den seg-Fehler, ich habe versucht, dies herauszufinden für eine Weile, aber ich habe nicht geantwortet. Hier ist die Methode remove:C++ - Das Löschen eines Knotens in der doppelt verketteten Liste verursacht einen Segmentierungsfehler

void* List::remove(long index){ 
    if(index > this->size-1){ 
    return NULL; 
    } 
    else { 
    long i = 0; 
    List::ListItem *item = this->head; 

    while(i <= this->size-1){ 
     if(index == 0){ 
      item->getNext()->setPrev(NULL); 
      this->head = item; 
      this->size--; 
      delete item; 
      break; 
     } 

     else if(indexOf(item->getData()) == index){ 
      item->getPrev()->setNext(this->head->getNext()); 
      item->getNext()->setPrev(this->head->getPrev()); 
      this->size --; 
      break; 
     } 
     else { 
      item = item->getNext(); 
      i++; 
     } 
    } 
} 
return NULL; 
} 
+1

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

Auch dieser Algorithmus ist es nicht wert, in einer verketteten Listenimplementierung hinzugefügt zu werden. Nicht was für Listen sind. – DeiDei

+0

@DeiDei Was ist falsch an meinem Algorithmus? Könnten Sie bitte genauer sein? –

Antwort

0

Ihr Algorithmus einige Probleme hat. Hier sind einige Korrekturen mit kleinen Kommentaren, um auf die Korrekturen hinzuweisen.

void/* * */ List::remove(long index){ 
    if(index > this->size-1){ 
    return /* NULL */; 
    } 
    else { 
    long i = 0; 
    List::ListItem *item = this->head; 

    while(i <= this->size-1 && i <= index /* new */){ 
     if(index == 0){ 
      item->getNext()->setPrev(this->head->getPrev() /* NULL */); 
      this->head->getPrev()->setNext(item->getNext()); // new 
      this->head = item->getNext(); 
      this->size--; 
      delete item; 
      break; 
     } 
     else if(indexOf(item->getData()) == index){ 
      item->getPrev()->setNext(item /* this->head*/ ->getNext()); 
      item->getNext()->setPrev(item /* this->head */ ->getPrev()); 
      this->size --; 
      break; 
     } 
     else { 
      item = item->getNext(); 
      i++; 
     } 
    } 
} 
return /* NULL */; 
} 

Ein Segmentfehler tritt auf, wenn index == 0. Ihre Liste beginnt immer mit item, selbst wenn item gelöscht wird. Sie müssen in einem solchen Fall this->head in die rechte Zelle ändern - die nächste nach Artikel.

Sie sollten sich etwas Zeit nehmen, um Ihre verknüpfte Liste auf Papier zu zeichnen und die Invarianten zu überprüfen. Wenn Sie die verschiedenen Fälle zeichnen, haben Sie eine Erklärung für den zweiten Fall.

+0

Unser Lehrer gab uns ein Klassendiagramm und ich implementiere es gerade, ich fand es wierd zwei –

Verwandte Themen