|
[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;
|