Einfach vertrackte Liste
lima-city → Forum → Programmiersprachen → C/C++ und D
alt kette
alt zeile
ankern
anzahl
code
element
erinnern
frohe weihnachten
genannten liste
gespeicherte zeile
hals
kette
kopf
liste
merken
null
richtige anzahl
rumpf
test
zeile
-
In folgender einfach verketteten Liste muss ein (vertrackter) Fehler sein. Ich weiß nur leider nicht, wo...
Ich kann mich heute damit nicht mehr beschäftigen, also gebe das Vergnügen mal an euch weiter!
EDIT: OK, beachtet am Besten nur die zweite Variante. Außerdem arbeiten beide nach dem LIFO-Prinzip.
typedef struct skette { char *zeile; struct skette *weiter; } kette; int anz_kette; kette test; void initkette() { anz_kette = sizeof(kette); test.zeile = NULL; test.weiter = NULL; } void merken(char* z, kette *anker) { kette *kopf = anker; while (kopf->weiter != NULL) kopf = kopf->weiter; if (kopf != anker) { kopf->weiter = malloc(anz_kette); kopf = kopf->weiter; kopf->weiter = NULL; } kopf->zeile = z; } char* erinnern(kette *anker) { kette *kopf = anker; kette *hals = NULL; while (kopf->weiter != NULL) { hals = kopf; kopf = kopf->weiter; } char* z = kopf->zeile; if (kopf != anker) { free(kopf); hals->weiter = NULL; } else kopf->zeile = NULL; return z; }
Funktionsweise:
Es werden hier Zeilen in einer "kette" genannten Liste (rückwärts) gespeichert oder ausgelesen. Leider scheint es, als ob immer nur ein Element der Liste bestünde (also der Nachfolger des Ankers ist immer NULL) und auch die gespeicherte Zeile beinhaltet nicht das, was sie sollte...
2. Variante (vorwärts):
void merken(char *z, kette *anker) { kette *rumpf = anker->weiter; anker->weiter = malloc(anz_kette); kette *kopf = anker->weiter; kopf->weiter = rumpf; kopf->zeile = z; } char *erinnern(kette *anker) { if (anker->weiter != NULL) { kette *rumpf = anker->weiter; char *z = rumpf->zeile; anker->weiter = rumpf->weiter; free(rumpf); return z; } else return ""; }
Hier stimmt anscheinend nur der Inhalt der Elemente nicht - Die Liste hat schonmal die richtige Anzahl an Elementen.
Vielen Dank im Vorraus und frohe Weihnachten!
Beitrag zuletzt geändert: 24.12.2012 11:36:51 von toolz -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo toolz,
Du solltest lieber zwischen den Ketten-Elementen und dem Kontainer unterscheiden, dann wird die Sache wesentlich einfacher:
#include <stdio.h> #include <stdlib.h> /* Elemente der Kette */ typedef struct ketten_element_ { struct ketten_element_ * weiter; char * zeile; } ketten_element_t; /* Kontainer für Kettenelemente */ typedef struct kette_ { ketten_element_t * kopf; long anzahl; } kette_t; void kette_init(kette_t * kette) { kette->kopf = NULL; kette->anzahl = 0; } void kette_merken(char *z, kette_t * kette) { ketten_element_t * neu; neu = (ketten_element_t*)malloc(sizeof(ketten_element_t)); neu->weiter = kette->kopf; neu->zeile = z; kette->kopf = neu; kette->anzahl++; } char * kette_erinnern(kette_t * kette) { ketten_element_t * alt; char * zeile; if(!kette->anzahl) return ""; alt = kette->kopf; kette->kopf = alt->weiter; kette->anzahl--; zeile = alt->zeile; free(alt); return zeile; } int main(int argc, char ** argv) { kette_t test; kette_init(&test); kette_merken("hallo 1\n", &test); kette_merken("hallo 2\n", &test); kette_merken("hallo 3\n", &test); while(test.anzahl) { printf(kette_erinnern(&test)); } getchar(); return 0; }
Fehlerbehandlung habe ich jetzt wegen der Übersichtlichkeit weggelassen.
Beitrag zuletzt geändert: 25.12.2012 1:22:40 von darkpandemic -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage