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
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