is-Logo

Dynamische Datenobjekte
Rekursive zeigerverkettete Liste - Quellcode (Auszug)

S. Spolwig

[Home | Algorithmen]

Page down

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;
(* ******************************************************************** *)
(* B E S C H R E I B U N G : DLISTE                                     *)
(* -------------------------------------------------------------------- *)
(* Version       : 2.x                                 vom: 22.05.94    *)
(* Autor         : S. Spolwig                                           *)
(* Funktion      : Das Progr. verwaltet Namen in einer einfachverkett.  *)
(*                 dyn. lin. Liste (rek. Version)                       *)
(*                 Die Liste ist leer oder                              *)
(*                 sie enthält ein Element gefolgt von einer Liste      *)
(* Compiler      : KICK-PASCAL 2.12 /  AMIGA                            *)
(* ******************************************************************** *)

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;

©    20. November 2007    Siegfried Spolwig

Page top