program colas_lista_enlazada_circular;

Type
    tCola = ^nodo;
    nodo = Record
         clave : Integer;
         sig : tCola;
    End;

Procedure Crear(Var c1 : tcola);
begin
     c1 := NIL
End;

Function Vacia(c1 : tcola) : Boolean;
Begin
     Vacia := c1 = NIL
End;

Procedure Encolar(Var c1 : tcola; elem : Integer);
Var
   nuevo : tcola;
begin
     new(nuevo);
     nuevo^.clave := elem;
     if c1 = NIL then
        nuevo^.sig := nuevo
     else begin
          nuevo^.sig := c1^.sig;
          c1^.sig := nuevo
     end;
     c1 := nuevo
end;

Procedure Desencolar(Var c1 : tcola; Var elem : Integer);
Var
   nuevo : tcola;
Begin
     elem := c1^.sig^.clave;
     if c1 = c1^.sig then begin
        dispose(c1);
        c1 := NIL
     end
     else begin
        nuevo := c1^.sig;
        c1^.sig := nuevo^.sig;
        dispose(nuevo)
     end
end;

  { Programa de prueba }
Var
   cola : tcola;
   elem : Integer;
begin
     crear(cola);
     if (vacia(cola)) then writeln('Cola vacia');
     encolar(cola, 3);
     desencolar(cola, elem)
end.