Verkettete Listen - Listen Addieren



  • @WillyWilson

    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:

    @WillyWilson

    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.


Anmelden zum Antworten