[Home |
Algorithmen] |
Der nachfolgende Programmausschnitt zeigt die
(klassische) rekursive Deklaration des Listentyps und die damit
ermöglichten rekursiven Datenzugriffe. Des weiteren ist in der procedure traversieren (li : TListen; procedure bearbeiten(var obj : TDaten)); der Einsatz eines Prozedurtyps gezeigt. |
program dliste; type TDaten = string; TListen = ^Knoten; { pointer to knoten ~ Elemente } Knoten = record Kopf : TDaten; Schwanz: TListen; { rekursive Datendefinition } end; (* ============================ LISTE ================================= *) procedure vorsetzen (var li : TListen; name : Tnamen); (* -------------------------------------------------------------------- *) (* Voraus: Die Liste initialisiert. *) (* Effekt: Das neue Element ist an den Anfang der Liste gesetzt. Wenn *) (* die Liste vorher leer war, ist das Element das erste. *) (* Die Listenlaenge ist um eins erhoeht. *) (* -------------------------------------------------------------------- *) var neuptr : TListen; begin new (neuptr); with neuptr^ do begin Kopf := name; Schwanz := li end; li := neuptr; end;(* vorsetzen; *) function laenge (var li : TListen) : integer; (* -------------------------------------------------------------------- *) (* Voraus: Die Liste ist initialisiert. *) (* Effekt: Die Funktion gibt die aktuelle Listenlange zurueck *) (* -------------------------------------------------------------------- *) var len : integer; begin len := 0; if li = nil then len := 0 else len := 1 + laenge(li^.Schwanz); { rekursiver Zugriff } laenge := len; end;(* laenge; *) procedure leeren(var li : TListen); (* -------------------------------------------------------------------- *) (* Zweck : Alle Element entfernen. *) (* Voraus: Die Liste ist initialisiert. *) (* Effekt: Liste ist leer. Listenlange ist 0 *) (* -------------------------------------------------------------------- *) begin if li <> NIL then with li^ do begin vorne_loeschen(li); leeren (li) {rekursiver Aufruf} end; end;(* leeren; *) procedure traversieren(li : TListen; procedure bearbeiten(var obj : TDaten)); (* -------------------------------------------------------------- *) begin if li <> NIL then with li^ do begin bearbeiten(Kopf); traversieren(Schwanz,bearbeiten) end; end; (* traversieren *) procedure traversieren_ausgeben (var li : TListen); (* -------------------------------------------------------------------- *) var name : Tnamen; begin if li <> NIL then with li^ do begin writeln('aus: ', Kopf); traversieren_ausgeben(Schwanz) {rekursiver Aufruf} end; (* with li *) end; |