linked list frage (aus /usr/include/linux/list.h)

moin leute.

ich bin gerade dabei mich mit der realisierung der doppelt verketteten listen auseinanderzusetzen, weil sie scheinbar - zumindest steht es so in meinem buch - im kernel immer wieder verwendet wird. das konzept von listen kenne ich bereits, habe damit auch schon in java gearbeitet, aber das hier scheint dann doch "ein wenig" anders zu sein.

was ich bis jetzt gefunden habe ist die folgende seite: http://isis.poly.edu/kulesh/stuff/src/klist/.
da steht, dass eine etwas abgeändert version der headerdatei "list.h" benutzt werden muss (siehe link auf der seite). ich erwähne das deshalbt, weil mir der originaldatei sich das beispiel unten nicht kompilieren lässt. ich kann nur "ahnen", dass es vllt an gewissen funktionalitäten liegt, die im user-mode nicht benutzt werden können. wie dem auch sei.

ich will lediglich mal einen beispiel mit diesen listen machen und zwar das folgende:

Code:
#include "list.h"
#include <stdio.h>

struct element {
	int wert;
	struct list_head liste;
};

int main(void) 
{	
	struct element beispielliste;
	INIT_LIST_HEAD(&beispielliste.liste);

	struct element *tmp;
	int i;
	for (i=0; i<5; i++)
	{
		tmp= (struct element *)malloc(sizeof(struct element));
		printf("gib wert ein: \n");
		scanf("%d",&tmp->wert);
		list_add(&(tmp->liste), &(beispielliste.liste));   // neues element in die liste einfügen
	}
	
        // HIER SOLEN DIE FÜNF WERTE WIEDER AUSGEGEBEN WERDEN

	return 0;
}

das beispiel ist weitgehend aus der oben genannten seite übernommen und funktoniert soweit. wie mache ich das nun, wenn ich z.b. die werte aller elemente der liste in einer shleife durchgehen und ausgeben will?
genauer: wie erreiche ich vom aktuellen element aus das nächste? was ich im moment überhaupt nicht verstehe ist, dass beispielliste.liste.next vom typ list_head ist, ich aber eigetlich das "element" haben will um eben dann auf "wert" zugreifen zu können. ich hoffe es ist verständlich was ich meine. von anderen listen her kenne ich das so, dass jeweils next auf eine datenstruktur desselben typs - in diesem fall also das struct "element" - zeigt, was hier aber nicht der fall ist.

würde mich sehr freuen, wenn mir jemand hier helfen könnte :)
danke schon einmal.

grüße,
alpha.
 
Aeh also das liegt erstmal an der Implementierung, die wollten etwas Typ-unabhaengiges.

im Beispiel wird ja gezeigt, wie man die Elemente durchlaufen kann, dafuer gibts das makro list_for_each

das Beispiel waere dann:

Code:
list_for_each(pos, &mylist.list){

		/* at this point: pos->next points to the next item's 'list' variable and 
		 * pos->prev points to the previous item's 'list' variable. Here item is 
		 * of type struct kool_list. But we need to access the item itself not the 
		 * variable 'list' in the item! macro list_entry() does just that. See "How
		 * does this work?" below for an explanation of how this is done.
		 */
		 tmp= list_entry(pos, struct kool_list, list);

		 /* given a pointer to struct list_head, type of data structure it is part of,
		  * and it's name (struct list_head's name in the data structure) it returns a
		  * pointer to the data structure in which the pointer is part of.
		  * For example, in the above line list_entry() will return a pointer to the
		  * struct kool_list item it is embedded in!
		  */

		 printf("to= %d from= %d\n", tmp->to, tmp->from);

	}

Das hab ich jetzt einfach kopiert, fuer info ueber Typen etc schau dir einfach das Beispiel nochmal an.

list_for_each_prev ist das makro fuer umgekehrtes durchmarschieren.

hth
 
aha. das macht sinn. ich glaube jetzt verstehe ich, wie es gemeint ist. vielen herzlichen dank für die schnelle und hilfreiche antwort :)

das nächste sollte ich vllt mal genauer lesen ...

grüße,
alpha.
 
Zurück
Oben