Program FRONTA01; { fronta nahradniku s fiktivnim prvkem } { funkce zarazeni, zruseni, odebrani } { prvniho a vypis } uses Crt; const ZADNEJM='NIC'; { prazdne jmeno } type TJMENO=string[20]; { typ jmena } UKAZATEL=^PRVEK; { typ ukazatel na prvek} PRVEK=record JMENO:TJMENO; { jmeno cestujiciho } DALSI:UKAZATEL { ukazatel na dalsi prvek} end; FRONTA=record ZACATEK:UKAZATEL; { ukazatel na zacatek fronty} KONEC:UKAZATEL { ukazatel na konec fronty} end; var NAHRADNICI :FRONTA; PRED,PREDCH :UKAZATEL; POZADAVEK :char; JM,JM1 :TJMENO; VYSL :boolean; function PRAZDNA(F:FRONTA):boolean; { zjistuje,zda fronta obsahuje jen fiktivni prvek} begin if (F.ZACATEK^.JMENO=ZADNEJM) and(F.ZACATEK^.DALSI=nil) then PRAZDNA:=true else PRAZDNA:=false; end; procedure HLEDEJ(S:UKAZATEL; J:TJMENO; var PREDCH:UKAZATEL; var VYSL:boolean); { hleda v seznamu, na jehoz zacatek ukazuje vstupni } { parametr S, prvek, jehoz polozka JMENO=J, } { preda ukazatel. na predchazejici prvek - vystupni } { parametr PREDCH,neni-li prvek nalezen VYSL je false } var POM:UKAZATEL; begin VYSL:=false; POM:=S; PREDCH:=S; while POM<>nil do begin if POM^.JMENO=J then begin VYSL:=true; { konec prohledavani } POM:=nil end else begin PREDCH:=POM; { dalsi } POM:=POM^.DALSI end end end; procedure ZRUS_NASL(PREDCH:UKAZATEL; var J:TJMENO); { zrusi nasledujici prvek v seznamu (fronte)} { a preda jmeno - vystup.param. J } var NASL:UKAZATEL; begin NASL:=PREDCH^.DALSI; PREDCH^.DALSI:=NASL^.DALSI; J:=NASL^.JMENO; dispose(NASL) end; procedure ODEBER_Z_FRONTY(var F:FRONTA; var J:TJMENO); { odebere prvni prvek z fronty a preda jeho jmeno } var POM:UKAZATEL; begin POM:=F.ZACATEK^.DALSI; { ukazatel na prvni prvek} J:=POM^.JMENO; F.ZACATEK^.DALSI:=POM^.DALSI; { posun zacatku na dalsi } if POM^.DALSI=nil then F.KONEC:=F.ZACATEK; {je-li prazdna } dispose(POM) end; Procedure ZARAD_DO_FRONTY(var F:FRONTA; J:TJMENO); { zaradi prvek-jmeno J na konec fronty} var POM:UKAZATEL; begin new(POM); with F do begin KONEC^.DALSI:=POM; KONEC:=POM; POM^.DALSI:=nil; POM^.JMENO:=J end end; procedure TISKNI_SEZNAM(S:UKAZATEL); { vypise vsechny prvky seznamu,vstupni parametr} { zacatek seznamu S } begin writeln('SEZNAM NAHRADNIKU'); while S<>nil do with S^ do begin if JMENO<>ZADNEJM then writeln(JMENO); S:=DALSI; end; end; procedure DIALOG(var POZADAVEK:char); begin ClrScr; { cti pozadavek } writeln('Zadej pozadavek N - novy nahradnik'); writeln(' U - uspokojeni nahradnika'); writeln(' Z - zruseni nahradnika'); writeln(' V - vypis nahradniku'); writeln(' K - konec'); write('POZADAVEK - OPERACE: '); readln(POZADAVEK); POZADAVEK:=Upcase(POZADAVEK); end; procedure INITUJ(var F:FRONTA); begin new(PRED); PRED^.JMENO:=ZADNEJM; PRED^.DALSI:=nil; F.ZACATEK:=PRED; F.KONEC:=PRED; end; { hlavni program} begin INITUJ(NAHRADNICI); DIALOG(POZADAVEK); { ziskej pozadavek } while POZADAVEK<> 'K' do begin case POZADAVEK of 'V': begin if PRAZDNA(NAHRADNICI) then Writeln('Seznam nahradniku je prazdny') else TISKNI_SEZNAM(NAHRADNICI.ZACATEK) end; 'N': begin write('Jmeno: '); Readln(JM); ZARAD_DO_FRONTY(NAHRADNICI,JM) end; 'Z': begin Write('Jmeno: '); Readln(JM); HLEDEJ(NAHRADNICI.ZACATEK,JM,PREDCH,VYSL); if VYSL=true then begin ZRUS_NASL(PREDCH,JM1); writeln('Rusim: ',JM1); end else writeln(JM,' nenalezen'); end; 'U': if PRAZDNA(NAHRADNICI) then writeln ('Fronta je prazdna') else begin ODEBER_Z_FRONTY(NAHRADNICI,JM1); writeln('Uspokojit zakaznika :',JM1) end; else writeln('CHYBNE ZADANA OPERACE') end; Readln; DIALOG(POZADAVEK); end; end.