Verkettete Listen - Listen Addieren
-
Du hängst ja auch nur die erste Liste an die zweite... damit hat sich an liste 1 gar nichts getan.
void List::insertFront(List & _List) { // Einfügen einer vorhandenen Liste am Anfang List.head_tail->prev->next = this->head_tail->next; //letzte Element vom _List zeigt auf das erste von this this->head_tail->next->prev = _List.head_tail->prev; //prev vom erste nelement von this zeigt auf das letzte von Liste //Jetzt sind beide Listen verbunden. Und zwar in _List, sollen aber in this this.head_tail->next = _List.head_tail->next; this.head_tail->prev = _List.head_tail->prev; //jetzt zeigen beide Listen auf die selben Elemente, also zweite Liste noch leeren _List.head_tail->next = _List.head_tail; this.head_tail->prev = _List.head_tail; }
ich hoffe, ich bin mit dem Head_tail Kram nicht durcheinander gekommen, wie schon mehrfach geschrieben, würde man das normalerweise anders machen und am Ende jeweils auf nullptr zeigen.
-
@Schlangenmensch sagte in Verkettete Listen - Listen Addieren:
Du hängst ja auch nur die erste Liste an die zweite... damit hat sich an liste 1 gar nichts getan.
void List::insertFront(List & _List) { // Einfügen einer vorhandenen Liste am Anfang List.head_tail->prev->next = this->head_tail->next; //letzte Element vom _List zeigt auf das erste von this this->head_tail->next->prev = _List.head_tail->prev; //prev vom erste nelement von this zeigt auf das letzte von Liste //Jetzt sind beide Listen verbunden. Und zwar in _List, sollen aber in this this.head_tail->next = _List.head_tail->next; this.head_tail->prev = _List.head_tail->prev; //jetzt zeigen beide Listen auf die selben Elemente, also zweite Liste noch leeren _List.head_tail->next = _List.head_tail; this.head_tail->prev = _List.head_tail; }
ich hoffe, ich bin mit dem Head_tail Kram nicht durcheinander gekommen, wie schon mehrfach geschrieben, würde man das normalerweise anders machen und am Ende jeweils auf nullptr zeigen.
@Schlangenmensch okay, hab es verstanden und hingekriegt. insertBack funktioniert jetzt auch. Es macht nur noch der destruktor probleme. Mal sehen ob ich es alleine gelöst bekomme
List::~List() { // Destruktor // Alle Knoten der Liste müssen gelöscht werden, wenn die Liste gelöscht wird. Node * ptr = head_tail->next; while (ptr != head_tail) { Node * tmp = ptr; ptr = ptr->next; delete tmp; } delete head_tail; std::cout << "Destruktor aufgerufen\n" << std::endl; }
Danke vielmals für die zahlreichen Antworten
Edit: habe jetzt auch herausgefunden was mit dem Destruktor los war. Er hat trotz Begrenzung versucht über den Endknoten (head_tail) hinaus zu deleten. Habe jetzt mit der Knotenanzahl der Liste die Grenze gesetzt und es scheint zu funktionieren:
List::~List() { // Destruktor // Alle Knoten der Liste müssen gelöscht werden, wenn die Liste gelöscht wird. Node *ptr = head_tail->next; Node *tmp = ptr; int anz = 0; // Darf nicht größer-gleich sein als anzahl der datensätze(nodes) in der Liste while (ptr != head_tail && anz < this->list_size) { ptr = ptr->next; delete tmp; tmp = ptr; anz++; } delete head_tail; // Liste komplett gelöscht std::cout << "Destruktor aufgerufen\n" << std::endl; }
Es gibt keine Memoryleaks und die Liste ist danach vollständig gelöscht.