program aufgabe26;

type TPerson = record
                 name    : string;
                 vorname : string;
                 alter   : integer
              end;

     PPlatz = ^TPlatz;
     TPlatz = record
                 mensch    : TPerson;
                 naechster : PPlatz
             end;

var stuhl,letzter: PPlatz;

procedure einfuegen(n,v : string; a: integer);
var neu : PPlatz;
begin
   new(neu);
   neu^.mensch.name := n;
   neu^.mensch.vorname := v;
   neu^.mensch.alter := a;
   if (stuhl=nil) then begin
      (* es gibt noch keine Personen in der Liste, dies wird das erste Element *)
      letzter := neu;
      stuhl := neu;
      neu^.naechster := stuhl;
   end
   else begin
      (* es gibt schon mindestens eine Person in der Liste *)
      neu^.naechster := stuhl;
      letzter^.naechster := neu;
      letzter := neu;
   end;
end;

procedure ausgeben();
var m : PPlatz;
begin
   if (stuhl<>nil) then begin
      m := stuhl;
      repeat
         writeln(m^.mensch.name,', ',m^.mensch.vorname,', Alter ',m^.mensch.alter);
         m := m^.naechster;
      until (m=stuhl); (* bis wir wieder am Anfang angekommen sind *)
   end
   else writeln('Es ist niemand mehr da.');
   writeln;
end;

(* raeumt den Speicher auf *)
procedure aufraeumen();
var m :  PPlatz;
begin
   if (letzter <> nil) then begin
      while (letzter^.naechster<>letzter) do begin
         m := stuhl^.naechster;
         dispose(stuhl);
         letzter^.naechster := m;
         stuhl := m;
      end;
      (* jetzt gibt es nur noch genau einen Eintrag *)
      dispose(stuhl);
      stuhl := nil;
      letzter := nil;
   end;
end;

begin
   stuhl := nil;
   letzter := nil;
   einfuegen('Duck','Darkwing',1);
   einfuegen('Darko','Donnie',17);
   einfuegen('Lane','Lois',25);
   einfuegen('Peel','Emma',27);
   einfuegen('Summers','Buffy',22);
   ausgeben();
   (* Zum Testen von Teil b und c verwenden:
   einen_weiter();
   ausgeben();
   while (stuhl <> nil) do reisenachjerusalem();
    *)
   aufraeumen(); (* das sollte nach der Reise nach Jerusalem nicht mehr noetig sein *)
end.
