Program Ringverkettung(input,output);

type
    element = ^recrd;
    recrd = record
        next : element;

        inhalt : string;
    end;

var
    anker : element;
    eingabe : string;

procedure kette_ein(var anker : element;
                    daten : string);
var
    help : element;
begin
    if anker=NIL then begin
        new(anker);
        anker^.next:=anker;
        anker^.inhalt:=daten;
    end else begin
        new(help);
        help^.next:=anker^.next;
        anker^.next:=help;
        help^.inhalt:=daten;
        anker:=help;
    end
end;

procedure kette_aus(var anker : element);
var
    help : element;
begin
    if anker=NIL then { Leere Liste }
    else begin
        if anker^.next=anker then begin { Nur ein Element }
            dispose(anker);
            anker:=NIL;
        end else begin
            help:=anker^.next;
            while help^.next<>anker do
                help:=help^.next;
            help^.next:=anker^.next;
            dispose(anker);
            anker:=help;
        end
    end
end;

procedure kette_zeigen(anker : element);
var
    help : element;
begin
    writeln;
    writeln('Aktueller Listeninhalt:');
    if anker=NIL then begin
        writeln('Liste ist leer');
    end else begin
        help:=anker;
        repeat
            writeln(help^.inhalt);
            help:=help^.next;
        until help=anker;
    end;
    writeln;
end;

begin
    anker:=NIL;

    writeln('Belege Kette vor');

    kette_ein(anker,'erster Eintrag');
    kette_ein(anker,'zweiter Eintrag');
    kette_ein(anker,'dritter Eintrag');
    kette_ein(anker,'vierter Eintrag');
    kette_ein(anker,'fuenfter Eintrag');

    kette_zeigen(anker);

    repeat
        writeln('Element einketten oder ausketten (Leereingabe)');
        readln(eingabe);
        if eingabe='' then
            kette_aus(anker)
        else
            kette_ein(anker,eingabe);
        kette_zeigen(anker);
    until anker=NIL;
end.
