Hi, ich knabberre gerade an einer Aufgabe aus einem c - Übungsbuch. Es geht um folgenden Codeausschnitt: /* G_Fileio.c --> Funktionen zur Datei Ein-/Ausgabe. */ #include "Giro.h" static char datei[] = "GIRO.DAT"; // Datei zum Speichern // der Konten. int read_file(void) { int error = 0; FILE *fp; ELEMENT *neu, *last = NULL; DATEN buffer; if( (fp = fopen(datei, "rb")) == NULL) return -1; while( fread(&buffer, sizeof(DATEN), 1, fp) == 1 ) { if( (neu = make_element()) == NULL) { error = 1; break; // Nicht genug Speicher } neu->konto = buffer; // Daten in das neue neu->next = NULL; // Element kopieren. // Neues Element an das Ende der Liste anhaengen: if(kopf.first == NULL) // Liste noch leer? kopf.first = neu; // Ja. else // Nein, letztes Element last->next = neu; // bekommt Nachfolger. last = neu; //last dient zur speicherung der adresse des vorgängers ++kopf.anzahl; } if( !error && !feof(fp) ) error = 3; // Lesefehler fclose(fp); return error; } .................................................................. //in einer header datei: struct element { DATEN konto; struct element *next; // Zeiger auf den Nachfolger. }; typedef struct element ELEMENT; typedef struct { unsigned anzahl; // Anzahl Listenelemente. ELEMENT *first; // Zeiger auf das Erste. } LISTENKOPF; /* --- globale Variablen --- */ extern LISTENKOPF kopf; .................................................................. mir geht es vor allem um diese anweisung : last->next = neu; // bekommt Nachfolger. last = neu; //last dient zur speicherung der adresse ich verstehe nicht genau wozu last benötigt wird bzw wie man ihn hier verwendet er wird am anfang mit NULL initialisiert und kriegt beim ersten durchlauf die adresse des ersten datensatzes. gibts hier jemanden der in einfachen worten erklären kann wozu last hier explizit dient und warum man die adresse des vorgängers speichern muss, ich sehe außerdem nicht wo das programm beim 2 durchlauf auf last zugreift wegen der adresse, weil "last->next = neu;" greift ja eigentlich auf next zu und nicht auf last
Bob Hulu schrieb:
> ich verstehe nicht genau wozu last benötigt wird
Zu Beginn: Leere Liste mit
kopf.first == NULL
last == NULL
Ein Element in der Liste:
kopf.first == element1
last == element1
Zwei Elemente in der Liste:
kopf.first == element1
last == element2
...
N Elemente in der Liste:
kopf.first == element1
last == elementN
'last' wird benutzt um das letzte Element der Liste zu speichern. Das
letzte Element der Liste wird jeweils benötigt, um ein weiteres Element
anzuhängen. Bildlich gesprochen: In einer Tabelle, die in Zeilen
geordnet ist, musst Du, um eine weitere Zeile anhängen zu können,
wissen, wo diese Zeile hin soll. Und wo soll die neue Zeile hin?
Natürlich hinter die letzte bereits vorhandene Zeile in der Tabelle.
Du kannst ja mal versuchen, das Beispiel so umzuschreiben, dass Du ohne
'last' auskommst; Du wirst sehen dass es dann zum Anhängen eines
weiteren Elements an das Ende der Liste erforderlich ist, das Ende der
Liste durch eine linearen Durchlauf durch die Liste zu ermitteln. Das
ergibt eine algorithmische Komplexität von O(N).
Die hier dargestellte Variante mit Zeiger 'last' hat hingegen eine
algorithmische Komplexität von O(1).
Stephan
vielen dank stephan das war sehr verständlich erklärt damit hat sich meine frage erledigt
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.