{
  Problema 1:
  Elaborati o function care returneaza numarul elementelor unei cozi.

  Problema 3:
  Prin coada cu rpioritati vom intelege o coada in care elementul de introdus
  se insereaza nu dupa ultimul element al cozii, ci inaintea tuturor elementelor
  cu o prioritate mai mica.
  Prioritatile elementelor se indica prin numere intregi.

}

Program Tema_2_6_Probl_3;
uses crt;
type Coada = ^Celula; {Adresa unei celule}
     Celula = record  {O celula}
       N: Integer;    {Prioritatea celulei}
       Urm: Coada;    {Adresa celulei urmatoare}
     end;

var P, U: Coada;
    nr: integer;

function QueueCount(P, U: Coada): Word;  {Numarul de elemente din coada}
var E: Coada;
    n: word;
begin
  n := 1;                      {Daca P = U, inseamna ca este numai un element in coada}
  if P = nil then n := 0 else  {Daca coada e vida, sunt 0 elemente}
  while (P <> U) do begin      {Cat timp nu se ajunge la ultimul element}
    inc(n);
    if P = nil then begin      {Eroare}
      writeln('Coada incorecta!');
      Break;
    end;
    P := P^.Urm;               {Trecerea la urmatorul element, fara a-l elimina}
  end;
  QueueCount := n;
end;

procedure Introdu(nr: integer); {Introduce numarul nr in coada, in pozitia corespunzatoare prioritatii}
var T, R: Coada;
begin
  New(R);
  R^.N := nr;
  if P = nil then begin  { Daca coada e vida, }
     P := R;             { se adauga elementul fara comparatia prioritatilor }
     U := R;
     R^.Urm := nil;
  end else               { Daca coada nu e vida... }
     if P^.N <= R^.N then begin {Inserarea inaintea primului element din coada}
       R^.Urm := P;
       P := R;
     end else begin             {Inserarea undeva in interiorul cozii}
       T := P;        {T va parcurge coada, cautand elementul dupa care se va insera R}
       while (T^.Urm <> nil) and (T^.Urm^.N > R^.N) do T := T^.Urm; {Parcurgerea cozii}
       R^.Urm := T^.Urm;   {R se insereaza dupa T}
       T^.Urm := R;
       if T = U then U := R; {Daca T a fost ultimul element, atunci R devine ultimul}
     end;
end;

procedure Afiseaza;
var R: Coada;
begin
  while (P <> nil) do begin
     write(P^.N, ' ');
     R := P;      {Extragem primul element din coada}
     P := P^.Urm; {Actualizarea adresei inceputului cozii}
     Dispose(R);  {Eliberarea memoriei alocata de primul element}
     if R = U then Exit; {Pentru cazul cand coada nu se sfarseste cu nil}
  end;
end;

begin
  clrscr;
  P := nil;  {Initial coada e vida}
  U := nil;
  writeln('Scrie un sir de numere intregi (0 va fi ultimul): ');

  repeat
    read(nr);
    Introdu(nr);
  until nr = 0;

  clrscr;
  writeln('Ati introdus ', QueueCount(P, U), ' numere:');
  writeln;
  Afiseaza;

  readkey;
end.