PROGRAM Linked (Input,Output);
{Written by Jason J Schwarz in Turbo Pascal v6.0.
Purpose : This is a demo program to show the use of linked lists.}


USES CRT;

TYPE
    Point = ^PointRecord;
    PointRecord = Record
                Char : CHAR;
                Next : Point;
    END;{PointRecord}

VAR
   Head : Point;
   Answer : CHAR;

PROCEDURE DeleteLn(Head : Point);
BEGIN
     IF Head<>NIL THEN BEGIN
        DeleteLn(Head^.Next);
        Head^.Next:=NIL;
        DISPOSE(Head);
     END;{Head<>NIL}
END;{DeleteLn}

PROCEDURE Delete;
VAR
   Current : Point;

BEGIN
     IF Head<>NIL THEN BEGIN
        Current:=Head^.Next;
        Head^.Next:=Nil;
        DISPOSE(Head);
        Head:=Current;
        Current:=Nil;
    END;{Head<>NIL}
END;{Delete}

PROCEDURE WriteStr(Head : Point);
BEGIN
     IF Head <> NIL THEN BEGIN
        WriteStr(Head^.Next);
        IF Head^.Char=CHR(13) THEN WRITELN
        ELSE WRITE(Output,Head^.Char);
     END;{Head <> NIL}
END;{WriteStr}

PROCEDURE TypeIn;
VAR
   Current : Point;
   Ins : CHAR;

BEGIN
     Head:=Nil;
     REPEAT
           Ins:=CHR(0);
           READ(Input,Ins);
           CASE Ins OF
                '!' : BEGIN
                           DeleteLn(Head);
                           Head:=NIL;
                      END;
                '@' : Delete;
                ELSE BEGIN
                     Current:=Head;
                     Head:=NIL;
                     NEW(Head);
                     Head^.Char:=Ins;
                     Head^.Next:=Current;
                     Current:=NIL;
                     IF Head^.Char=CHR(13) THEN BEGIN
                        WriteStr(Head);
                        DeleteLn(Head);
                     END;{Head^.Char}
               END;{ELSE}
           END;{CASE}
     UNTIL Ins=CHR(13);
END;

PROCEDURE Instruct;
BEGIN
     CLRSCR;
     GOTOXY(22,1);
     WRITELN(Output,'Linked List Demo by Jason John Schwarz');
     WRITELN(Output);
     WRITELN(Output,'Press ! to Delete the Line');
     WRITELN(Output,'Press @ to Delete the Previous Character');
END;{Instruct}

BEGIN
     REPEAT
           Instruct;
           TypeIn;
           WRITELN(Output,'Another?(Y/N)');
           READ(Input,Answer);
           READLN(Input,Answer);
     UNTIL Answer IN ['N','n'];
END.
