PROGRAM WaitingList(Input, Output);

                              { Program 10.1 - Simulate the client waiting list;
                                                            serve the first 3. }

    CONST
        NameLength = 15;
    TYPE
        NameIndex = 1..NameLength;
        NameString = PACKED ARRAY [NameIndex] OF Char;
        Natural = 0..MaxInt;
        ClientPointer = ^Client;
        Client = RECORD
            Name: NameString;
            Nxt: ClientPointer;
        END;

    VAR
        Head, Tail, ClientToServe: ClientPointer;
        Name: PACKED ARRAY [NameIndex] OF Char;         { whay not NameString? }

    PROCEDURE ReadName;
        VAR
            C: NameIndex;
    BEGIN
        FOR C := 1 TO NameLength DO
            IF Eoln(Input) THEN
                Name[C] := ' '
            ELSE BEGIN
                Read(Input, Name[C]);
                Write(Output, Name[C])
            END;
        ReadLn(Input);
        WriteLn(Output)
    END;                                                            { ReadName }

    PROCEDURE AddClientToList;
        VAR
            NewClient: ClientPointer;
    BEGIN
        New(NewClient);
        IF Head = NIL THEN
            Head := NewClient
        ELSE
            Tail^.Nxt := NewClient;
        NewClient^.Name := Name;
        NewClient^.Nxt := NIL;
        Tail := NewClient
    END;                                                     { AddClientToList }

    PROCEDURE ServeClient(HowMany: Natural);
    BEGIN
        WHILE (HowMany > 0) AND (Head <> NIL) DO BEGIN
            ClientToServe := Head;
            Head := Head^.Nxt;
            WriteLn(ClientToServe^.Name);
            Dispose(ClientToServe);
            HowMany := HowMany - 1
        END
    END;                                                       { Serve clients }

BEGIN
    Head := NIL;
    WHILE NOT Eof(Input) DO BEGIN
        ReadName;
        AddClientToList
    END;
    WriteLn(Output);
    ServeClient(3)
END.
