PROGRAM linked_list_example;

TYPE next_pointer = ^full_name;

     full_name = RECORD
       first_name : STRING[12];
       initial    : CHAR;
       last_name  : STRING[15];
       next       : next_pointer;
     END;

VAR  start_of_list : next_pointer;
     place_in_list : next_pointer;
     temp_place    : next_pointer;
     index         : INTEGER;

BEGIN  (* main program *)
                       (* generate the first name in the list *)
  new(place_in_list);
  start_of_list := place_in_list;
  place_in_list^.first_name := 'John';
  place_in_list^.initial := 'Q';
  place_in_list^.last_name := 'Doe';
  place_in_list^.next := NIL;
                       (* generate another name in the list *)
  temp_place := place_in_list;
  new(place_in_list);
  temp_place^.next := place_in_list;
  place_in_list^.first_name := 'Mary';
  place_in_list^.initial := 'R';
  place_in_list^.last_name := 'Johnson';
  place_in_list^.next := NIL;
                  (* add 10 more names to complete the list *)
  FOR index := 1 TO 10 DO
  BEGIN
    temp_place := place_in_list;
    new(place_in_list);
    temp_place^.next := place_in_list;
    place_in_list^.first_name := 'William';
    place_in_list^.initial := 'S';
    place_in_list^.last_name := 'Jones';
    place_in_list^.next := NIL;
  END;
                   (* display the list on the video monitor *)
  place_in_list := start_of_list;
  REPEAT
    WRITE(place_in_list^.first_name);
    WRITE(' ',place_in_list^.initial);
    WRITELN(' ',place_in_list^.last_name);
    temp_place := place_in_list;
    place_in_list := place_in_list^.next;
  UNTIL temp_place^.next = NIL;
END.  (* of main program *)
