unit mListe;

interface

type
  Kettenelement=class(TObject)
  private
    kenntObjekt:TObject;
    kenntNachfolger:Kettenelement;
  public
    constructor init(pObjekt:TObject);
    function    objekt:TObject;
    function    nachfolger:Kettenelement;
    function    hatNachfolger:boolean;
    procedure   setzeObjekt(pObjekt:TObject);
    procedure   setzeNachfolger(pNachfolger:Kettenelement);
    destructor  gibFrei;
  end;

  Liste=class(TObject)
  private
    kenntErstes, kenntAktuelles:Kettenelement;
  public
    constructor init; virtual;
    procedure einfuegen(pNeues:tObject); virtual;
    procedure zumAnfang; virtual;
    procedure zumNaechsten; virtual;
    function letzter:boolean; virtual;
    function zeigeElement:tobject; virtual;
    function leer:boolean; virtual;
    destructor gibFrei; virtual;
    end;


implementation

  constructor Kettenelement.init(pObjekt:TObject);
  begin
    kenntObjekt:=pObjekt;
    kenntNachfolger:=nil;
  end;

  function Kettenelement.objekt:TObject;
  begin
    result:=kenntObjekt;
  end;

  function Kettenelement.nachfolger:Kettenelement;
  begin
    result:=kenntNachfolger;
  end;

  function KettenElement.hatNachfolger:boolean;
  begin
    result:=kenntNachfolger<>nil;
  end;

  procedure Kettenelement.setzeObjekt(pObjekt:TObject);
  begin
    kenntObjekt:=pObjekt;
  end;

  procedure Kettenelement.setzeNachfolger(pNachfolger:Kettenelement);
  begin
    kenntNachfolger:=pNachfolger;
  end;

  destructor Kettenelement.gibFrei;
  begin
  end;

  constructor Liste.init;
  begin
   kenntErstes:=nil;
   kenntAktuelles:=nil;
  end;

  procedure Liste.einfuegen(pNeues:tObject);
    var neuesKettenelement:Kettenelement;
  begin
    neuesKettenelement:=Kettenelement.init(pNeues);
    neuesKettenelement.setzeNachfolger(kenntErstes);
    kenntErstes:=neuesKettenelement;
    kenntAktuelles:=neuesKettenelement;
  end;

  procedure Liste.zumAnfang;
  begin
    kenntAktuelles:=kenntErstes;
  end;

  procedure Liste.zumNaechsten;
  begin
    if kenntAktuelles.hatNachfolger then
      kenntAktuelles:=kenntAktuelles.nachfolger;
  end;

  function Liste.letzter:boolean;
  begin
    result:=(kenntErstes=nil) or not kenntAktuelles.hatNachfolger;
  end;

  function Liste.zeigeElement:tObject;
  begin
    result:=kenntAktuelles.objekt ;
  end;

  function Liste.leer:boolean;
  begin
    result:=(kenntErstes=nil)
  end;

  destructor Liste.gibFrei;
  begin
    while not self.leer do begin
      kenntAktuelles:=kenntErstes;
      kenntErstes:=kenntErstes.kenntNachfolger;
      kenntAktuelles.gibFrei;
    end
  end;

end.


