Element vorher einfügen?



  • Danke für den Tip. findElement() wär eine Idee, aber das muss ich doch auch irgendwie so kapieren. Ich hab jetzt übrigens nach stundenlagem Sinieren eine Möglichkeit gefunden wie's geht, allerdings nur, wenn die zu Löschende Stelle genau einer Position ist. Problem dabei ist, die letzte Zeile Code:

    void List::deleteAfter(int afterElem)
    {
    	Node* tmp = head;
    	Node* iter = head;
    
    	while(iter->value != afterElem)
    	{
    		iter = iter->next;	//iterator weiterschalten
    
    		if(iter->value == afterElem)	//steht head wirklich VOR dem zu Löschenden Element?
    		{
    			tmp = tmp->next;
    			tmp = tmp->next->next;
    		}
    	}
    
    	head->next->next = tmp;
    }
    

    Ich ändere jetzt auch nirgends, bis auf die letzte Zeile, head.



  • Lass head aus dem Spiel.
    Warum willst du dauernd head aendern?

    head ist der Kopf/Start deiner Liste. Den fasst man nicht an.

    Wie wuerdest du findElement() implementieren? findElement(val) liefert dir einen Zeiger auf die Node die val als Value hat.



  • So würd ich das machen:

    Node* List::findElementAfter(int val)
    {
    	Node* tmp = head;
    
    	while(tmp->value != val)
    	{
    		tmp = tmp->next;
    	}
    
    return tmp->next;	//Jetzt steht Zeiger VOR dem zu Löschenden Element
    }
    

    Problem dabei find ich da jetzt nur, dass ich für deleteAfter und deleteBefore ZWEI Methoden mit dem fast gleichen Code brauche!



  • In dem Fall wuerdest du 1 nach dem gesuchten Element stehen. Alles korrekt, nur dein Kommentar nicht 😉

    Nur dass ich mit findElement das gesuchte Element haben wollte. Denn das Problem mit findElementAfter ist, dass du ja schon auf dem zuloeschenden Element stehst - wir brauchen aber den vorgaenger (sprich das Element mit dem Value val).

    Aber wenn wir nun das gesuchte Element haben:

    Node* node=findElement(val);
    node->next=node->next->next;
    

    Wenn du dann soweit bist dass das funktioniert - kannst du findElement ja durchaus wieder in deleteElementAfter() integrieren.

    Ich persoenlich finde es aber oft einfacher eine komplexe Aufgabe in kleine unter aufgaben zu zerlegen und diese systematisch durchzuarbeiten.

    PS:
    und wie du siehst, fasst du in diesem Code head nicht an. Genauso soll es sein 🙂



  • Ich kapier das einfach nicht. Das "Zusammenbauen" der beiden teile.

    Ich hab diese Liste: 010000. findElementAfter() macht daraus: 0000.

    Ich will die die zweite 0 vonlinks aushängen. Und jetzt hab ich von der Programmierung das Problem, wie ich die auf die 3. 0 von links verbinde...

    Vor allem: Von welcher Stelle aus von links auf die Stelle verbunden werden soll die findElementAfter() liefert, verstehe ich nicht, da das ja von Fall zu Fall unterschiedlich ist!

    Edit:

    Node* List::findElementAfter(int val)
    {
    	Node* tmp = head;
    
    	while(tmp->value != val)
    	{
    		tmp = tmp->next;
    	}
    
    return tmp;
    }
    
    void List::deleteAfter(int afterElem)
    {
    
    	Node* node = findElementAfter(afterElem);
    	node->next = node->next->next;
    }
    

    So wie's jetzt dasteht hab ich das beste Ergebnis: 1000. Mir fehlt aber immer noch die Null an der Stelle ganz links...

    Edit vom Edit:

    So wie der Code jetzt ob steht funktioniert das ganze mit dieser Ausgabefunktion:

    void List::printList()
    {
    	Node* curr = head;
    
    	while(curr != NULL)
    	{
    		std::cout << curr->value;
    		curr = curr->next;
    	}
    
    	std::cout << std::endl;
    }
    

    Jetzt versteh ich gar nix mehr...



  • Ich hab dann mal die findElementAfter() wieder in die eigentliche Funktion integriert:

    void List::deleteAfter(int afterElem)
    {
    	Node* tmp = head;
    	Node* node;
    
    	while(tmp->value != afterElem)
    	{
    		tmp = tmp->next;
    	}
    
    	node = tmp;
    
    	node->next = node->next->next;
    }
    

    Ist da jetzt noch was überflüssiges drin?



  • vip@r schrieb:

    Jetzt versteh ich gar nix mehr...

    Was genau ist dir unklar?

    vip@r schrieb:

    Ist da jetzt noch was überflüssiges drin?

    node=tmp;
    stattdessen kannst du ja gleich tmp weiter verwenden.

    Und du musst noch beachten was passiert wenn afterElement das letzte Element ist.
    Und natuerlich die Node selber muss noch per delete geloescht werden.
    Und du musst noch beachten was passiert wenn afterElement nicht gefunden wird in der Liste.

    Aber prinzipiell funktioniert das so.


Anmelden zum Antworten