Erste Element einer verketteten Liste wird nicht gelöscht



  • Hallo,

    ich habe ein verkettete Liste und muss eine Funktion schreiben um diese zu Löschen, bislang sieht das so aus:

    void LoescheLst (SFil* aflLstStart) //ERSTE ELEMENT WIRD NICHT GELÖSCHT:::PRÜFEN!!!
    {
    	SFil* FilTemp;
    
    	while (aflLstStart)
    	{
    		FilTemp=aflLstStart;
    		aflLstStart=FilTemp->aflNext;
    		free(FilTemp);
    
    	}
    return;
    }
    

    Funktioniert auch soweit, nur wird das erste Element nicht gelöscht. Hat jemand einen Tipp wie ich das erste gelöscht bekomme ?

    Gruss,
    Lalas



  • Hallo lalas,

    die Funktion tut schon das, was sie soll. Sie löscht alle Elemente, ab dem
    Element, wo aflLstStart zu Beginn drauf zeigt.

    Ich vermute mal, dass du nach dem Löschen noch auf das erste Element
    deiner Liste zugreifen möchtest. Dies ist auch noch möglich, da ein
    free() den Speicher für das System wieder frei gibt, aber den Inhalt
    dieser Speicherstelle nicht überschreibt. C überprüft nicht, ob ein
    Zeiger auf einen zugewiesenen Speicherbereich zeigt, sondern erlaubt
    diesen Zugriff einfach.

    Hier siehst du nun: du gibst den Speicher mit free zwar frei, aber
    in der Zwischenzeit hat noch keiner in diesen Speicher geschrieben,
    so dass es den Anschein hat, dass das erste Element nicht freigegeben
    wurde.

    Um solche Fehler zu finden, kann man sehr gut valgrind zu Hilfe ziehen.

    Gruß mcr



  • Danke für die Antwort. Also der pointer aflLstStart zeigt auf das erste Listen-Element. Im konkreten Fall handelt es sich um eine Liste von Filialen.

    Ich muss einfach nur eine Funktion schreiben die die gesamte Liste (inkl. dem ersten Element) löscht.

    Da FilTemp zu beginnt der while-Schleife auf das erste Element zeigt, müsste es doch gelöscht werden. Beim zweiten Schleifendurchlauf zeigt FilTemp dann auf das zweite Element, usw.
    Irgendwie scheint also die Funktion den Startpointer gleich zu Beginn auf das zweite Element zu switchen.

    Irgendwie muss das doch funktionieren, ohne erst irgendwelche Debugger laufen zu lassen etc., zumal das eine simple Hausaufgabe ist.



  • Hast Du mcrs Beitrag gelesen? Deine Funktion löscht die komplette Liste. Dass Du noch darauf zugreifen kannst, ist Zufall und liegt in der Natur von C.



  • du musst einen zeiger auf das erste element der liste übergeben.



  • Ich übergebe den Zeiger auf das erste Element.

    Alles klar, habe es nun verstanden, der Speicher steht nach dem Aufruf von free wieder zur Verfügung, aber der Speicherinhalt wird nicht überschrieben (mit 0/1).

    Wie kann ich es denn dann bewerkstelligen, dass bei einem erneuten Aufruf der "alten" Liste, der Startpointer quasi NULL gesetzt ist (und somit ja dann hoffentlich ins leere zeigt und nichts ausgegeben wird)

    würde ein

    aflLstStart=NULL;
    

    nach der while-schleife dafür sorgen ? kann es leider grad nicht ausprobieren



  • lalas schrieb:

    Ich übergebe den Zeiger auf das erste Element.

    Alles klar, habe es nun verstanden, der Speicher steht nach dem Aufruf von free wieder zur Verfügung, aber der Speicherinhalt wird nicht überschrieben (mit 0/1).

    genügt nicht etwas zu wissen, dass der Speicher freigegeben wurde?

    lalas schrieb:

    Wie kann ich es denn dann bewerkstelligen, dass bei einem erneuten Aufruf der "alten" Liste, der Startpointer quasi NULL gesetzt ist (und somit ja dann hoffentlich ins leere zeigt und nichts ausgegeben wird)

    Indem du den Zeiger als Zeiger übergibst

    void LoescheLst (SFil** aflLstStart)
    {
        SFil* FilNext = *aflLstStart, *FilAct;
    
        while (FilNext)
        {
            FilAct = FilNext;
            FilNext = FilTemp->aflNext;
            free(FilAct);
        }
        *aflLstStart = NULL;
    }
    

Log in to reply