Verständnisproblem: Wie funktioniert dieses struct gebilde



  • hallo,

    habe mir linux kernelarchitektur zugelegt, und gleich an anfang kommt ein verständnisproblem: es wird eine struktur verwendet, die sich durch das ganze buch ziehen wird und immer wieder benutzt wird, daher muss ich das dingen verstehen.

    besagte struktur sieht so aus

    struct list_head {
          struct list_head *next, *prev;
    };
    

    und ich kapiere einfach nicht wozu das gut sein soll. beide zeiger in der struktur koennen nur ebenfalls auf eine solche struktur zeigen, die aber nix beinhalten kann. also kann man damit schoene list_head ketten machen, aber was bringts 😕

    das dingen soll dazu gut sein verkettete listen zu bilden. wenn ich aber (lineare) verkettete listen gebaut hab, dann immer so

    struct wurst {
          int fleisch;
          char *schwein;
          struct wurst *next;
    };
    
    struct wurst *head;
    

    somit kann head->next = irgend_eine_andere_struktur_vom_typ_wurst
    die liste gebaut werden.

    wie siehts mit dem list_head aus? wollen wir ein beispiel machen

    struct kuchen {
            int salz
            char mehl;
            double zucker;
            struct list_head run_list;
    };
    
    struct kuchen lecker;
    

    also das list_head wird immer in anderen, "normalen" strukturen benutzt, wie halt auch der verlauf des buches zeigt

    aber was soll das bringen? wie soll man damit eine verkettete liste bauen? sagen wir ich will die erste struktur fuellen. kein problem

    if ( lecker != NULL)
    {
    /* struct wird gefuellt */
    lecker.run_list.next = NULL
    lecker.run_list.prev = NULL
    }

    bla okay. die erste struct ist also gefuellt. jetzt will man eine neue struct anhaengen

    struct kuchen *tmp;

    /* speicher reservieren, struct fuellen, bla */

    und wie soll das dingen nun an die alte struct angehaengen werden?

    lecker.run_list.next = tmp;

    geht ja net, da next und prev von run_list nur auf list_head elemente zeigen koennen. und was bringt das wenn sie nur auf solche zeigen koennen, die koennen ja nix beinhalten

    😕 also ich versteh da garnichts mehr. wozu ist das dingen also gut und wie funktioniert das?

    danke 🙂



  • vieleicht kannst du mal schreiben in welchem zusammenhang dieses gebilde verwendet wird.
    ansonnsten kann ich mir nur vorstellen, dass evtl. die pointer selber das interessante sind und man mit der liste ne liste von pointern hat.



  • Eine Mögliche Benutzung dieser Struktur ist

    struct list_head {
          struct list_head *next, *prev;
    };
    
    typdef struct MyData
    {
    int a;
    float b;
    char *c;
    };
    
    typedef struct 
    {
    struct list_head pointers
    MyData *Daten
    } Liste;
    

    Sie wird hier benutzt umd die Listenverwaltung von den Daten zu trennen;



  • @ulath
    ein beispiel habe ich doch oben gezeigt! das struct list_head wird in einer anderen struktur definiert. wofuer und weshalb wuesste ich selber ma gern, denke halt fuer binary trees auch wenns irgendwie alles kein sinn macht (halt mein verstaendnisproblem)

    wieso liste von pointern? gut du hast dann jede menge ptr, aber die zeigen ja auch alle nur wieder auf list_head elements

    @PAD

    verstehe ich jetzt nicht ganz. das ist doch nichts anderes als mein beispiel oder? sagen wir du willst jetzt damit arbeiten

    Liste.Daten->a = 4
    bla damit kannste die fuellen, Liste.pointers.next und prev = NULL
    jetzt kommt ein neues element zu der liste. wird halt auch speicher geholt und die struct gefuellt.

    aber wie kann nun die erste struct auf die neue struct verweisen? next und prev koennen doch auch jeweils wieder nur auf list_head strukturen verweisen


Anmelden zum Antworten