program Halda_2; {Operace s haldou - druha verze (vylepsena)} const Max = 100; type Halda = record Data: array[1..Max] of integer; Pocet: 0..Max end; procedure Error; {Pomocna procedura - hlaseni v pripade pokusu o vyber z prazdne haldy nebo prekroceni kapacity haldy} begin writeln('Chyba na halde!') end; function Min (var H: Halda): integer; {Urceni minimalni hodnoty ulozene v halde H - zustane zachovana} begin with H do if Pocet = 0 then begin Min := 0; Error end else Min := Data[1] end; {Min} procedure Pridej (var H: Halda; X: integer); {Pridani hodnoty X do haldy H} var j,p: integer; Pokracovat: boolean; begin with H do if Pocet = Max then Error else begin Pocet := Pocet+1; j := Pocet; Pokracovat := j > 1; while Pokracovat do begin p := j div 2; if X < Data[p] then begin Data[j] := Data[p]; j := p; Pokracovat := j > 1 end else Pokracovat := false end; Data[j] := X end end; {Pridej} procedure ZrusMin (var H: Halda); {Vypusteni minimalni hodnoty z haldy H} var j,n,X: integer; Pokracovat: boolean; begin with H do if Pocet = 0 then Error else begin X := Data[Pocet]; Pocet := Pocet-1; j := 1; Pokracovat := 2 <= Pocet; while Pokracovat do begin n := 2*j; if n < Pocet then if Data[n+1] < Data[n] then n:=n+1; if X > Data[n] then begin Data[j] := Data[n]; j := n; Pokracovat := 2*j <= Pocet end else Pokracovat := false end; Data[j] := X end end; {ZrusMin} procedure Vypis (H: Halda); {Pomocny kontrolni vypis obsahu haldy H} var i:integer; begin with H do for i:= 1 to Pocet do write(Data[i],' '); writeln end; {Vypis} var H: Halda; I, X:integer; begin H.Pocet:=0; writeln('Pozadovana akce:'); writeln('1 ... nalezt minimum, 2 ... pridat hodnotu, 3 ... zrusit minimum'); writeln('4 ... vypis haldy, 0 ... konec'); repeat read(I); case I of 1: writeln('>',Min(H),'<'); 2: begin write(' pridavana hodnota: '); readln(X); Pridej(H,X); end; 3: ZrusMin(H); 4: Vypis(H) end until I=0 end.