2016-03-19 18 views
1

Ich habe bereits single-linked zyklische Liste gemacht, die gut funktioniert, aber in diesem Fall bin ich auf ein solches Problem stoßen, dass, wenn ich Schwanz entfernen möchte, wird es entfernen es, wenn der Knoten als Schwanz eingefügt wurde, aber nicht, wenn es als Kopf eingefügt wurde. Ich nehme an, das Problem liegt in Insertionhead-Inserttail Verbindung oder Delete Tail-Funktion, kann aber nicht finden. Ich werde für deine Hilfe dankbar sein.C++ Doppelt verkettete Liste "delete tail" -Funktion

Struktur:

struct Element{ 
int value; 
Element *prev, *next; 

};

struct List2W{ 
    Element *tail; 
}; 

Code:

void insertHead(List2W& l, int x){ 

Element *new_head = new Element; 
new_head->value=x; 

if(isEmpty(l)) 
{ 
    new_head->next=new_head; 
    new_head->prev=new_head; 
    l.tail=new_head; 
} 
else 
{ 
    new_head->next=l.tail->next; 
    new_head->prev=l.tail; 
    l.tail->next=new_head; 
} 

}

void insertTail(List2W& l, int x){ 

Element *new_tail = new Element; 
new_tail->value=x; 

if(isEmpty(l)) 
{ 
    new_tail->next=new_tail; 
    new_tail->prev=new_tail; 
} 
else 
{ 
    new_tail->next=l.tail->next; 
    new_tail->prev=l.tail; 
    l.tail->next=new_tail; 
} 
l.tail=new_tail; 

}

bool deleteTail(List2W& l, int &value){ 

if(isEmpty(l)) 
    return false; 

else if(l.tail->next==l.tail) 
    { 
     value=l.tail->value; 
     l.tail=NULL; 
    } 

else 
{ 
    value=l.tail->value; 
    (l.tail->prev)->next=l.tail->next; 
    (l.tail->next)->prev=l.tail->prev; 
    l.tail=l.tail->prev; 
} 
return true;} 

Antwort

0

enter image description here

+0

Wow, Sie haben sich sogar die Mühe gemacht, Bilder zu zeichnen. Danke für das. Ich verstehe nicht, warum Sie sagen, dass Insertionhead unmöglich ist. Ich sehe dort keinen Fehler und es scheint gut zu funktionieren. Könnten Sie bitte weiter erklären, warum (1) nicht funktioniert? new_tail-> next = l.tail-> next; // für das "next" in new element ordne ich das selbe was für das tail war, welches auf head zeigt, also sollte new_tail-> next auf l.tail-> next zeigen (was head ist) – NoobProgrammerWannabe

+0

hab ich verstanden . Vielleicht war mein Verständnis falsch. – nariuji

+0

Ich habe meine Antwort bearbeitet. Bitte beziehen Sie sich darauf, wenn Sie brauchen. – nariuji

0

Okay, so meine inserthead Funktion fehlte eine Linie, die vorherige mit new_head Kopf verbinden sollte:

else 
    { 
     (l.tail->next)->prev=new_head; // here 
     new_head->next=l.tail->next; 
     new_head->prev=l.tail; 
     l.tail->next=new_head; 
    } 

Danke @nariuji, du hast mich diese Funktion wieder analize, und vielen Dank für Ihr Interesse. Ansonsten muss ich nur darauf achten, den Schwanz tatsächlich zu löschen, um den Speicher freizugeben und sollte in Ordnung sein.