Datenstrukturen Dynamische Datenstrukturen 3-6 Dynamische Datenstrukturen 5-6
ATOS - Around The Operating System Das ATOS-Magazin 3/96

Dynamische Datenstrukturen 4-6

Die Idee

Wir wollen also z.B. folgende Daten verwalten (Beispiel: CD-Verwaltung):

        CD-Nummer (Word)
        CD-Titel  (String, 40 Bytes)
        Gruppe    (String, 40 Bytes)
Da wir nicht wissen, wieviele CDs der Benutzer hat bzw. noch kaufen wird, sollte die Liste frei erweiterbar sein (ein Feld ist also hier ungeeignet).

Wie kriegen wir die obigen Daten nun so hin, daß wir sie frei erweitern können?

Nun gibt es in wohl so ziemlich jedem Betriebssystem Funktionen zum Belegen von neuen Speicherblöcken zur Laufzeit. Im GEMDOS sind dies Malloc() und Mfree() (auf die anderen Funktionen gehe ich hier nicht ein).

Diese Befehle wurden meist in die Programmiersprachen mit übernommen, so gibt es z.B. in C die Funktionen malloc(), der man die gewünschte Speichergröße übergibt und einen Zeiger auf den Speicherblock zurückbekommt, und die Funktion free(), die den Speicherblock wieder frei gibt.

Ein Zeiger ist (meist) ein long-Wert, der auf eine Speicherstelle 'zeigt', also die Speicheradresse beinhaltet. Wir können uns den zurückgelieferten Zeiger also bildlich so vorstellen:





Was machen wir jetzt damit? Der Trick ist nun, in diesen Speicherblock wieder einen Zeiger auf den nächsten Block zu legen.

Unsere C-Struktur sieht dann wie folgt aus:

typedef struct eintrag
{
        int cd_nr;              /* die CD-Nummer */
        char titel[41],         /* Der CD-Titel */
             gruppe[41];        /* Die Gruppe */
        struct eintrag *next;   /* Zeiger auf den nächsten Eintrag */
} Eintrag;
Anmerkung: Die Zeichenketten haben jeweils noch ein Byte mehr zur Terminierung. In C wird jeder String durch ein Nullbyte beendet.

Nun könnten wir also eine Liste erzeugen, indem wir in jedem neuen Block jeweils auf einen anderen verweisen:





Das Ende wird üblicherweise in C mit NULL markiert, in Pascal mit NIL. Man kann das Ende aber natürlich auch anders markieren, z.B. durch einen Zeiger auf sich selbst.

Der nächste Abschnitt gibt uns die Möglichkeit, Einträge einzufügen.