home *** CD-ROM | disk | FTP | other *** search
- {============================================================================}
- { Dieses Modul stellt Routinen zur Speicherung der in der 1. Folge vorgestel-
- lten verketteten Listen zur Verfuegung. Die Prozedur 'einfuegen' ist neu
- vormuliert worden, weil es sich anbietet, auch sie die neue Prozedur
- 'verketten' benutzen zu lassen. 'einfuegen' ist also im vorigen Programm
- nicht mehr zu deklarieren, sondern an seine Stelle sind diese Prozeduren
- zu schreiben. Im Hauptprogramm kann dann das Menue erweitert werden, z. B.
- mit den Kommandos 'l' und 's'. }
- {----------------------------------------------------------------------------}
-
- PROCEDURE verketten (VAR liste, neuelem: zeiger);
-
- { Das Einfuegen eines Elementes in die Liste (verketten) wird sowohl bei der
- Eingabe als auch beim Laden von Disk benoetigt, ist also gut als eigene
- Prozedur geeignet. Uebergeben werden an diese Prozedur eine Liste und ein
- Zeiger auf das einzufuegende Element, in dem die Information also schon
- enthalten sein muss. }
-
- VAR desiglast, designext, elem: zeiger;
-
- BEGIN
- suchlauf(liste, neuelem^.info.stichwort, desiglast, elem, designext);
- IF elem = nil THEN { wenn Eintrag noch nicht vorhanden }
- BEGIN
- neuelem^.next := designext; { In beiden Richtungen in }
- neuelem^.last := desiglast; { die Liste einketten }
- desiglast^.next := neuelem;
- designext^.last := neuelem;
- END
- ELSE
- WriteLn('Eintrag schon vorhanden.')
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE einfuegen (VAR liste: zeiger; neukey: key);
-
- { Diese Prozedur generiert einen neuen Speicherplatz, liest die neue Infor-
- mation, sucht die Position, an die der neue Eintrag gehoert und fuegt ihn
- in die Liste ein. }
-
- VAR neuelem, desiglast, designext: zeiger;
-
- BEGIN
- explicit_new(neuelem);
- restinfo(neukey, neuelem^.info);
- verketten(liste,neuelem)
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE save (liste: zeiger);
-
- { Die als Parameter uebergebene Liste wird in der Datei 'a:liste.seq' gespei-
- chert. Der Dateiname kann selbstverstaendlich auch als Parameter ueber-
- geben werden, zur Demonstration reicht es aber auch so. Die Folge
- 'assign(datei,name); rewrite(datei)' ist bei einigen Pascal-Dialekten zu
- 'rewrite(datei,name)' zusammengefasst. }
-
- BEGIN
- Assign(datei, 'A:liste.seq');
- ReWrite(datei);
- liste := liste^.next;
- WHILE liste^.info.stichwort <> maxkey DO
- BEGIN
- Write(datei, liste^.info);
- liste := liste^.next
- END;
- Close(datei) { je nach Dialekt: close(datei,lock) }
- END;
-
- {----------------------------------------------------------------------------}
-
- PROCEDURE load (VAR liste: zeiger);
-
- { Das Gegenstueck zum Saven. Die Datei 'a:liste.seq' wird geladen und in der
- uebergeben Liste gespeichert. Auch hier kann eine Uebergabe des Dateinamens
- als Parameter sinnvoll sein. Um keine Heap-Adressen brach liegen zu lassen,
- sollte die Liste entweder ungenutzt sein oder vorher geloescht werden, da
- sie neu initialisiert wird. }
-
- VAR elem: zeiger;
-
- BEGIN
- Assign(datei, 'A:liste.seq');
- Reset(datei);
- init(liste);
- WHILE NOT (Eof(datei)) DO
- BEGIN
- explicit_new(elem);
- Read(datei, elem^.info);
- verketten(liste,elem)
- END;
- Close(datei)
- END;