Dobrý den,
ustavičně uvažuji nad zjednodušením jednoho dílčí procedury, kterou jsem napsal. Už několik hodin hledám způsoby jak více a více zredukovat časovou složitost následujícího kódu, aby se neprováděli žádné akce, které nejsou nezbytné a také se snažím doladit ho do spolehlivé podoby tak, aby nic nemohlo způsobit pád programu. Myslím, že algoritmus už je vcelku obstojný, ale i přes to bych ho chtěl dát i sem, zda vaše zkušenější oko neuvidí nějaké lepší řešení.
Jedná se o algoritmus pro odebrání prvku ze struktury. Tady je zdrojový kód:
type UkPrvek = ^Prvek;
Prvek = record
Data: byte;
Dalsi: UkPrvek;
end;
Zasobnik = record
Zac, Kon: UkPrvek;
end;
procedure Odeber(var Z: Zasobnik; D: byte);
var Poz, Pom: UkPrvek;
Zarazka : boolean;
begin
Zarazka:=false;
if not Empty(Z) then
with Z do begin
Poz:=Zac;
if ( Poz^.Data = D ) then begin
Zac:=Zac^.Dalsi;
dispose(Poz);
end else
while ( Poz^.Dalsi <> nil ) and ( Zarazka = false ) do begin
if ( Poz^.Dalsi^.Data = D ) then begin
Pom:=Poz^.Dalsi;
if ( Pom = Kon ) then begin
Kon:=Poz;
Poz^.Dalsi:=nil;
end else begin
Poz^.Dalsi:=Pom^.Dalsi;
Poz:=Poz^.Dalsi;
Zarazka:=true;
end;
dispose(Pom);
end else Poz:=Poz^.Dalsi;
end;
end;
end;
Nejvíce mě na algoritmu trápí to, že jsem použil Zarazka : boolean; a přemýšlím nad tím, jak bez tohoto prvku zajistit to, aby v případě, že prvek naleznu se neprocházel zbytek struktury aniž bych použil break, nebo podobné zlo.