Verkettete Listen freigeben?



  • Hi,

    ich gib meine verketteten Liste bis jetzt immer so frei:

    void Freigeben(person_t *first)
    {
    	person_t *aktuell;
    
    	while(first) // Liste leer bzw. schon alles freigegeben
    	{
    		aktuell = first;
    		first = first->next;
    		free(aktuell);
    	}
    }
    

    Ist das korrekt oder macht man es normalerweiße anders?



  • Sieht auf den ersten Blick ganz gut aus.

    Und solange du dir nicht den Ast absägst, auf dem du sitzt, ist eigentlich alles erlaubt 😉 (wichtig ist, daß es funktioniert)

    PS: Eventuell solltest du nach der Arbeit noch dafür sorgen, daß der Listenstart im Hauptprogramm auf NULL gesetzt wird.



  • Vielen Dank für die schnelle Antwort! 🙂

    Und solange du dir nicht den Ast absägst, auf dem du sitzt, ist eigentlich alles erlaubt 😉 (wichtig ist, daß es funktioniert)

    Funktionieren tut es, zumindest habe ich es mit den verschiedensten Eingaben getestet und auch durch den Debugger laufen lassen.

    Allerdings ist mir noch nicht ganz klar, was der Vorteil der folgenden Methode (aus C von A bis Z) bzw. der Nachteil meiner ist:

    void loesche_alles(void) {
       struct angestellt *zeiger, *zeiger1;
       /* Ist überhaupt eine Liste zum Löschen vorhanden? */
       if(anfang != NULL) {
          /*Es ist eine vorhanden....*/
          zeiger=anfang->next;
          while(zeiger != NULL) {
             zeiger1=anfang->next->next;
             anfang->next=zeiger1;
             free(zeiger->next);
             free(zeiger);
             zeiger=zeiger1;
          }
          /* Jetzt löschen wir erst den Anfang der Liste */
          free(anfang->next);
          free(anfang);
          anfang=NULL;
          printf("Liste erfolgreich gelöscht!!\n");
       }
       else
          fprintf(stderr,"Keine Liste zum Löschen vorhanden!!\n");
    }
    

    PS: Eventuell solltest du nach der Arbeit noch dafür sorgen, daß der Listenstart im Hauptprogramm auf NULL gesetzt wird.

    Stimmt, das wäre vielleicht nicht so blöd, dann muss ich allerdings wieder auf Pointer-to-Pointer zurückgreifen, oder?



  • Dein Code ist besser als der Code (aus C von A bis Z), weil Dein Code ohne globale Variable arbeitet.
    Um den Listenstart im Hauptprogramm auf NULL zu setzen ist "Pointer-to-Pointer" das Richtige.

    //...
        person_t** = &firstPtr;
    //...
    
    void Freigeben(person_t** first) 
    { 
        person_t* aktuell; 
    
        while(*first) // Liste leer bzw. schon alles freigegeben 
        { 
            aktuell = *first; 
            *first = (*first)->next; 
            free(aktuell); 
        } 
        *first = NULL;
    }
    

Log in to reply