(******************************************************
*
*               POINTERS
*
*       This program will input a list of names, store
*       them in a linked list, output the list, release
*       the storage and end.  It is a demo program but
*       can be expanded to just about anything.
*
*       Extracted from the Pascal/Z manual, page 49.
*
*       Editor for this program was Charlie Foster
*       June 1980
*******************************************************)

PROGRAM pointers;

TYPE    link    = ^namerec;
       namerec = RECORD
                       name : string 20;
                       next : link
                       END;

VAR     m1    : link;   { FOR STORING THE MARK }
       first : link;   { FOR FINDING THE FIRST NAME }
       last  : link;   { FOR FINDING THE LAST NAME }
       x     : link;   { FOR CHASING THROUGH THE LIST }

BEGIN
       MARK(m1);       { MARK SETS POINTER TO TOP/HEAP }
       first := nil;   { 1st NAME POINTER=0 }
       REPEAT
               IF first = nil THEN
                  BEGIN
                       NEW(last);      { ALLOCATE A NEW REC }
                       first := last
                  END
               ELSE
                  BEGIN
                       NEW(last^.next);
                       last := last^.next
                  END;
               WRITE('Name (* = Done )');
               READLN(last^.name);     { GET PERSONS NAME }
               last^.next := nil
       UNTIL last^.name ='*';
{ PRINT OUT THE NAMES }
       x := first;
       WHILE x^.next <> nil DO
          BEGIN
               WRITELN(x^.name);
               x := x^.next
          END;
{ RESTORE THE STORAGE }
       RELEASE(m1);
END.