Linked List, Problem beim löschen eines Elements



  • Ich hab mir gedacht ich schreib auch mal eine verkettete Liste ... ich hab das früher immer nicht gecheckt und dachte eigentlich jetzt es durchschaut zu haben 😉

    Das Problem was ich habe ist das wenn ich beim Entfernen den Pointer des Elements vor dem zu löschenden Element auf das Element nach dem zu löschenden Element setze und dann das Element lösche, der Pointer trotzdem irgendwo ins Nirvana zeigt und die liste quasi an der stelle unterbrochen ist wo man ein element löscht...

    Hier mal der Code von dem ListenElement:

    class Element
    {
    public:
    	Element(); //Konstruktor;
    
    	//Variablen / Pointer:
    	Element *pNext;
    	int data;
    };
    
    Element::Element()
    {
    	pNext=NULL;
    	data=0;
    }
    

    Und hier mal der die Linked List Klasse + Code zum entfernen:

    class LinkedList
    {
    public:
    	LinkedList();
    	void Add(int data);
    	void Remove(int Element);
    	int GetNumber(int Element);
    	Element *GetPointer(int Element);
    	int Size();
    
    private:
    	Element *pFirst;
    	Element *pLast;
    	Element *pActual;
    	int size;
    };
    //----------------------------------------------------------
    void LinkedList::Remove(int Element)
    {
    	pActual=pFirst;
    
    	if(Element==0)
    	{
    	pFirst=pFirst->pNext;
    	delete[] pActual;
    	}
    	else
    	{
    		for(int i=0;i<Element-1;i++)
    		{
    			pActual=pActual->pNext;
    		}
    		cout<<"Vor zu loesch:"<<pActual->data<<endl;
    		cout<<"Nach zu loesch:"<<pActual->pNext->pNext->data<<endl;
    
    		pActual->pNext=pActual->pNext->pNext;
    		pActual= pActual->pNext;
    		delete[] pActual;
    	}
    	size--;
    }
    

    Ich habe mir diese stelle jetzt schon des öffteren angeguckt und ich verstehe einfach nicht wo das Problem ist! Ich hoffe ihr könnt mir da helfen...
    Wenn ich das erste Element lösche funzt das übriegens ... und wenn ich das delete weg lasse dann funktioniert das auch nur das ich dann ja speicher "verschenke" 😉

    Und dann hätte ich da noch eine frage ... wieso kann ich in der Klassen Deklaration einen Pointer auf ein Element machen und in einer der Member Funktionen nicht ? Da sagt er dann immer unbekannter Typ ...



  • Element* toBeDeleted = pActual->pNext;
        pActual->pNext=pActual->pNext->pNext;
        delete toBeDeleted;
    

    Die [] beim delete gehören da vermutlich nicht hin, da Du wahrscheinlich keine Arrays von Elements erzeugst.
    Deine andere Frage verstehe ich nicht, gib am besten ein Beispiel.



  • Element* asdf = pActual;
    pActual = asdf->pNext;
    asdf->pNext = pActual->pNext;
    delete pActual;
    

    Die Reihenfolge stimmte nicht, so müsste es funktionieren. Du hast zuerst den pNext Pointer verändert und bist dann diesem neuen pNext Pointer nachgegangen.
    Der Zeiger auf das aktuelle (englisch current!) Element gehört nicht in die Klasse, sondern in die Methode, da er nur dort verwendet wird.
    Außerdem sind die Elementpointer doch eigentlich keine Arrays, also delete statt delete[]



  • Oh... jo das mit dem löschen funktioniert jetzt ... das mir das nicht irgendwann mal aufgefallen ist ... 😉

    Aber ich kann in der Methode keinen Pointer erstellen 😞
    wenn ich also dein "Element* asdf" da erstellen möchte sagt der
    "error C2065: 'asdf' : nichtdeklarierter Bezeichner"
    Ursprünglich wollte ich pCurrent(;)) auch darein packen ging nur nicht ...

    Danke schonmal für eure schnelle Hilfe 🙂



  • Weil Du den Übergabeparameter auch Element genannt hast ?



  • Doh!... wie ungeschickt 🙂

    Danke 🙂


Anmelden zum Antworten