Liste komplett Löschen



  • Hi,

    wie lösche ich eine List in einer Funktion komplett. Ich rufe eine Funktion auf und die soll die ganze List löschen.

    Die Struktur der Liste sieht so aus.

    typedef struct __LISTE
    {
        double Element;
        struct __LISTE *next;
    }LISTE;
    

    Ich lerne gerade C und habe Probleme mit der Aufgabe. Das Einfügen und Löschen des ersten Elements geht, aber das da oben bekomme ich nicht hin.



  • Du schreibst leider nichts über die Struktur deiner Liste, trotz der Ankündigung, daher geh ich mal vom LISP-Style aus, d.h. die Liste wird repräsentiert durch einen Zeiger auf das erste Element, jedes Element ist mit dem folgenden verkettet, die Verkettung des letzten Elementes ist leer, mit anderen Worten, ein Nullzeiger (Es gibt andere Möglichkeiten.)
    Das Löschen funktioniert dann ganz straight-forward rekursiv:

    /* Eine leere Liste zu löschen ist eine Noop. Ansonsten lösche ich eine Liste,
       indem ich ihren Kopf und die Restliste lösche */
    void destroy_list(LISTE* list) {
      if (list) {
        LISTE* temp = list->next;
        free(list);
        destroy_list(temp);
      }
    }
    

    Die Funktion ist endrekursiv und sollte einfach in eine Iteration umgewandelt werden, so man denn wünscht. Ich hoffe das Prinzip wird rekursiv klarer. HTH HAND.

    PS: Bezeichner in Großbuchstaben, die keine Preprozessorkonstanten oder -makros bezeichnen, sind suboptimal. Warum nicht Liste statt LISTE?

    PPS: Bezeichner, die mit 2 Unterstrichen beginnen, sind verboten (siehe ANSI-C Standard). Es besteht kein Grund, überhaupt einen anderen Bezeichner für den Namen der Struktur einzuführen, folgendes ist völlig legal:

    typedef struct List {
      double data;
      struct List * next;
    } List;
    


  • Habe gar nicht gewusst das man eine Funktion aus sich selbst herraus aufrufen kann. Wie gesagt ich bin noch am lernen und heute habe ich wieder was neues dazu gelernt.

    PS:Welche Möglichkeiten gibt es noch eine List zu ralisieren? Und danke für die Tipps mit den definitionen der Variablen.



  • Sedgewick z.B. läßt den letzten Knoten auf sich selbst zeigen.

    [ Dieser Beitrag wurde am 13.10.2002 um 09:54 Uhr von Bashar editiert. ]



  • Es gibt auch die Möglichkeit, die Liste durch 2 Zeiger auf Anfang und Ende anzusprechen, und bei Suchoperationen in den letzten Knoten (der nur als Endemarkierung gedacht ist und nicht zur eigentlichen Liste gehört) das Gesuchte hineinzuschreiben. Dann entfällt der ständige Test, ob man das Ende bereits erreicht hat, da die Suche in jedem Fall zunächst erfolgreich verläuft. Ob sie tatsächlich erfolgreich war, erfährt man durch einen Vergleich des gefundenen Knotens mit dem Ende-Zeiger.



  • Wo ich jetzt bei den Listen bin. Jetzt habe ich mal verstanden wie Listen funktionieren und wofür man diese einsetzten kann. Wozu gibt es aber Bäume (ein praktisches Beispiel).


Anmelden zum Antworten