unit Schlange2;

interface
  type tZeiger =^tElement;

       tElement = record
         inhalt : string;
         zNaechster : tZeiger;
         end;

       tSchlange = record
         zKopf,zEnde : tZeiger;
         end;

  procedure erzeuge (var schlange:tSchlange);
  function leer (var schlange:tSchlange) : boolean;
  function kopf (var schlange:tSchlange) : string;
  procedure hintendran (var schlange:tSchlange; x:string);
  procedure reduziere (var schlange:tSchlange);

implementation

    procedure erzeuge (var Schlange:tSchlange);
      begin
        Schlange.zKopf := NIL;
        Schlange.zEnde := NIL;
      end;

    function leer (var Schlange:tSchlange) : boolean;
      begin
        if (Schlange.zKopf = NIL)
          then
            leer := true
          else
            leer := false;
      end;

  function kopf (var Schlange:tSchlange) : string;
    begin
      if (leer(Schlange))
        then
          kopf := 'Schlange ist leer!'
        else
          kopf := Schlange.zKopf.inhalt;
    end;

  procedure hintendran (var schlange:tSchlange; x:string);
      var neu : tZeiger;
    begin
      new(neu);
      neu.inhalt := x;
      neu.zNaechster := NIL;

      if (leer(Schlange))
        then
          Schlange.zKopf := neu
        else
          Schlange.zEnde.zNaechster := neu;

      Schlange.zEnde := neu;
    end;

  procedure reduziere (var schlange:tSchlange);
      var tmp : tZeiger;
    begin
      if (leer(Schlange))
        then
          writeln('Schlange ist leer!')
        else
          begin
            tmp := Schlange.zKopf.zNaechster;
            dispose(Schlange.zKopf);
            Schlange.zKopf := tmp;
          end;
    end;
end.
