Forum: PC-Programmierung verkettet Listen dateizugriff


von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

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

von Stephan M. (stephanm)


Lesenswert?

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

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

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
Noch kein Account? Hier anmelden.