doppelt verkettete liste
-
hallo,
eigentlich weiss ich, wie eine doppelt verkettete Liste aussieht (z.B. so:
struct liste { struct liste *vorherige_liste; struct liste *nächste_liste; ... };
das ist klar, aber wie funktioniert so was?:
struct liste { struct liste **vorherige_liste; struct liste *nächste_liste; ... };
worauf zeigt **vorherige_liste? Ich weiss dass es ein Zeiger auf einen Zeiger ist. Aber für was soll das gut sein?
gruss
nightmare_frog
-
Hi,
in welchem Zusammenhang hast Du das denn gefunden? Stückchen mehr Code wäre schön.
Alaaf,
Oliver
-
Wieso behauptest du, es wäre klar, wenn du dann 2 verschiedenen Codeschnipsel postest? Was ist deine eigentliche Frage? Gehts um verkettete Listen oder um Zeiger auf Zeiger? Ordne mal deine Gedanken ...
-
struct liste
{
struct liste *vorherige_liste;
struct liste *nächste_liste;
...
};naja...so wie die vars benannt sind, klingt des so als ob man ne liste von listen machen wollte:)
struct ListElement { struct ListElement*prevElement; struct ListElement*nextElement; .. }
wär scho besser...
das mit dem ** kenn ich bei listen nicht und würd deswegen einfach mal behaupten daß des nicht so ganz stimmt:)
[ Dieser Beitrag wurde am 03.03.2003 um 10:26 Uhr von crass editiert. ]
-
man sollte nie die Seite neu laden, wenn man einen Forum-Eintrag gemacht hat
[ Dieser Beitrag wurde am 03.03.2003 um 15:04 Uhr von nightmare_frog editiert. ]
-
danke für die vielen Antworten...
da es offenbar nicht ganz klar ist, was ich meine, poste ich einen Teil des Codes (aus einem Tutorial auf www.ressourcecode.de ), der Pixel-Partikel auf dem Bildschirm erstellt :
//hier wird die Struktur erstellt: typedef struct particle_s { struct particle_s **pprev; /* Linked list */ struct particle_s *next; int color; /* Farbe im Bildschirmformat */ float x, y; /* Momentane Position auf dem Schirm */ float vx, vy; /* Geschwindigkeit */ } particle_t; particle_t *g_pParticles = 0; //Diese Funktion füllt die Daten in ein Element der Liste particle_t *P_Create(float x, float y, int color, float vx, float vy) { particle_t *p = (particle_t *)malloc(sizeof(particle_t)); p->color = color; p->x = x; p->y = y; p->vx = vx; p->vy = vy; p->next = g_pParticles; if (p->next) p->next->pprev = &p->next; p->pprev = &g_pParticles; g_pParticles = p; return p; }
ist struct particle_s **pprev; vielleicht nur ein Tippfehler des Tutorial-Schreibers?
gruss
nightmare_frog
ps es sollte eigentlich struct liste *vorheriges_element heissen, ich weiss nicht, wie ich auf *vorherige_liste gekommen bin ...
[ Dieser Beitrag wurde am 03.03.2003 um 14:59 Uhr von nightmare_frog editiert. ]
-
ein tippfehler scheint es nicht zu sein...er weißt ja später dem zeiger die adresse des anderen zeigers zu...mir bleibt aber irgendwie der sinn des ganzen verschlossen, da man ne LinkedList sicherlich (ich selber habs schon mehrmals gemacht) auch mit prev und next als normale Zeiger machen kann, was auch wesenltich einheitlicher und unkomplizierter is
-
na ja, mir bleibt der Sinn auch verborgen, ich habe sowas selber auch noch nie gesehen, darum habe ich es ja hier gepostet . Aber auf was zeigt denn **pprev ??
-
**pprev ist kein Zeiger, siehe Deklaration:
struct listelement **prev; // **prev ist ein listelement // aber: *prev ist Zeiger auf ein Listenelement // prev ist Zeiger auf einen Zeiger auf ein Listenelement
Ich würd das jedenfalls nicht nachmachen (zumindest nicht ohne Kommentierung, warum das grad so und nicht anders gemacht wurde).
[ Dieser Beitrag wurde am 03.03.2003 um 15:30 Uhr von Bashar editiert. ]