1

Ich habe Code geschrieben, um Elemente in eine kreisförmige doppelt verknüpfte Liste einzufügen und diese Elemente anzuzeigen. Ich soll auch in der Lage sein, den Endknoten aus der Liste zu löschen, sowie die Liste nach einem bestimmten Element durchsuchen.Löschen von Knoten aus der kreisförmigen doppelt verknüpften Liste

Das ist mein Arbeits Code für Add und Druck:

void Circular_DLList::add_to_tail(int a) 
{ 
    DLLNode *temp = new DLLNode; 
    temp->info = a; 
    if (is_empty()) { 
     tail = temp; 
     temp->next = tail; 
     temp->prev = tail; 
    } 
    else { 
     temp->next = tail->next; 
     temp->prev = tail; 
     tail = temp; 
     tail->prev->next = temp; 
    } 
} 

void Circular_DLList::print_list() 
{ 
    DLLNode *ptr; 
    ptr = tail->next; 
    do { 
     cout<< ptr->info << endl; 
     ptr = ptr->next; 
    } 
    while(ptr != tail->next); 
} 

Egal, was ich für die delete_from_tail Funktion schreiben, es erzeugt einen Segmentation Fault: 11. Dies ist mein Versuch für die Funktion (die den Fehler auslöst).

int Circular_DLList::delete_from_tail() 
{ 
    int a = tail->info; 
    if(tail == tail->next) { 
     delete tail; 
     tail = NULL; 
    } 
    else { 
     tail = tail->prev; 
     delete tail->next; 
     tail->next = NULL; 
    } 
    return a; 
} 

Jeder Rat, wie dies zu beheben wäre fantastisch. Ich habe versucht, zu debuggen, aber ich kann nicht scheinen, das Problem herauszufinden, oder wo genau es sich sogar bezieht. Danke

+0

Sie wissen, dass Konzept der zirkulären Linkliste ist eigentlich kein Ende Recht zu haben? –

+0

@UsamaZafar Ja, aber wir arbeiten mit einem Knoten namens Tail, also war es nur eine einfache Art, das zu sagen. Ich werde den Beitrag bearbeiten, um zu klären – btoohey

+0

Tritt der Fehler beim Löschen selbst auf? Ich rate nicht. Ich denke, dass es auf Druck nach dem Löschrecht auftritt? –

Antwort

0

Das Problem ist ziemlich offensichtlich, wenn Sie es genau betrachten. Ihre Löschfunktion unterbricht die kreisförmige Kette der Linkliste. Wie das? Ihre Löschfunktion unter:

int Circular_DLList::delete_from_tail() 
{ 
    int a = tail->info; 
    DLLNode *temp; 

    if(tail == tail->next) { 
     delete tail; 
     tail = NULL; 
    } 
    else { 
     tail = tail->prev; 
     delete tail->next; 
     tail->next = NULL; 
    } 
    return a; 
} 

In der else-condition Sie setzen tail->next = NULL die eigentlich der Fehler ist und damit bricht die Kette. Wenn also Print aufgerufen wird, wird angenommen, dass die zirkuläre Kette intakt ist, und versucht daher versehentlich, auf einen NULL-Zeiger zuzugreifen, was wiederum zu einem Segmentierungsfehler führt.

Der Fix ist sehr einfach den Code unten sehen:

int Circular_DLList::delete_from_tail() 
{ 
    int a = tail->info; 
    if(tail == tail->next) { 
     delete tail; 
     tail = NULL; 
    } 
    else { 
     temp = tail; 
     tail = tail->prev; 
     tail->next = temp->next;  // To maintain the circular chain 
     tail->next->previous = tail; // Since this element's previous also point to the node about to be deleted 
     delete temp; 
     temp = NULL; 
    } 
    return a; 
} 
+0

Vielen Dank, Sie haben keine Ahnung, wie sehr ich das schätze und vielen Dank für die Erklärung. Es funktioniert perfekt! – btoohey

+0

@btoohey Ich bin froh, dass es hilfreich war. –