www.mikrocontroller.net

Forum: PC-Programmierung verkettet Listen dateizugriff


Autor: Bob Hulu (Firma: hinter den 7 bergen) (bob128)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan M. (stephanm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bob Hulu (Firma: hinter den 7 bergen) (bob128)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank stephan das war sehr verständlich erklärt damit hat sich 
meine frage erledigt

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.