IMPLEMENTATION MODULE RecnikATP; FROM IO IMPORT RdKey, WrStr, WrLn, WrCard; FROM SYSTEM IMPORT TSIZE; FROM Str IMPORT Compare; FROM Storage IMPORT ALLOCATE, DEALLOCATE; PROCEDURE Hash(Rec: String): Indeksi; VAR i, Zbir, Temp: CARDINAL; BEGIN Zbir:= 0; i:= 1; WHILE (i <= MaxDuzRec) AND (Rec[i] # CHR(0)) DO Temp:= (ORD(Rec[i]) * ORD(Rec[i])) MOD Broj; Zbir:= (Zbir + Temp) MOD Broj; INC(i); END; RETURN Zbir; END Hash; PROCEDURE Inicijalizuj(VAR R: Recnik); VAR i: Indeksi; BEGIN WITH R DO BrojReci:= 0; FOR i := 0 TO MaxTabela DO NEW(Domace[i]); Domace[i]^.Veza := Domace[i]; NEW(Strane[i]); Strane[i]^.Veza := Strane[i] END; END; END Inicijalizuj; PROCEDURE Unisti(VAR R: Recnik); VAR i: Indeksi; Tekuci: Lista; BEGIN FOR i:= 0 TO MaxTabela DO WHILE R.Domace[i] # R.Domace[i]^.Veza DO Tekuci:= R.Domace[i]^.Veza; R.Domace[i]^.Veza:= Tekuci^.Veza; DISPOSE(Tekuci); END; DISPOSE(R.Domace[i]); WHILE R.Strane[i] # R.Strane[i]^.Veza DO Tekuci:= R.Strane[i]^.Veza; R.Strane[i]^.Veza:= Tekuci^.Veza; DISPOSE(Tekuci); END; DISPOSE(R.Strane[i]); END; END Unisti; PROCEDURE Nadji(VAR Rec: String; VAR Tab: Tabela; VAR Prethodni: Lista; VAR Nadjen: BOOLEAN); VAR Pozicija: Indeksi; BEGIN Pozicija:= Hash(Rec); Prethodni:= Tab[Pozicija]; Prethodni^.Rec:= Rec; IF Prethodni^.Veza = Prethodni THEN Nadjen:= FALSE; ELSE WHILE Compare(Prethodni^.Veza^.Rec, Rec) # 0 DO Prethodni:= Prethodni^.Veza; END; Nadjen:= Prethodni^.Veza # Tab[Pozicija] END; END Nadji; PROCEDURE Ubaci(DomacaRec, StranaRec: String; VAR R: Recnik; VAR Duplikat: BOOLEAN); VAR NadjenDom, NadjenStr: BOOLEAN; PrethodniDom, PrethodniStr, PomDom, PomStr: Lista; BEGIN Nadji(DomacaRec, R.Domace, PrethodniDom, NadjenDom); Nadji(StranaRec, R.Strane, PrethodniStr, NadjenStr); IF NadjenDom OR NadjenStr THEN Duplikat:= TRUE; ELSE Duplikat := FALSE; NEW(PomDom); PomDom^.Rec:= DomacaRec; PomDom^.Veza:= PrethodniDom^.Veza; PrethodniDom^.Veza:= PomDom; NEW(PomStr); PomStr^.Rec:= StranaRec; PomStr^.Veza:= PrethodniStr^.Veza; PrethodniStr^.Veza:= PomStr; PomDom^.Prevod:= PomStr; PomStr^.Prevod:= PomDom; INC(R.BrojReci); END; END Ubaci; PROCEDURE Izbaci(Rec: String; VAR R: Recnik; Domaca: BOOLEAN; VAR Ok: BOOLEAN); VAR Prethodni, Prethodni2, Temp, Temp2: Lista; BEGIN IF Domaca THEN Nadji(Rec, R.Domace, Prethodni, Ok); ELSE Nadji(Rec, R.Strane, Prethodni, Ok); END; IF Ok THEN Temp:= Prethodni^.Veza; Prethodni^.Veza:= Temp^.Veza; Temp2:= Temp^.Prevod; Prethodni2:= Temp2^.Veza; WHILE Prethodni2^.Veza # Temp2 DO Prethodni2:= Prethodni2^.Veza; END; Prethodni2^.Veza:= Temp2^.Veza; DISPOSE(Temp); DISPOSE(Temp2); DEC(R.BrojReci); END; END Izbaci; PROCEDURE Prevedi(StranuNaDomacu: BOOLEAN; Rec: String; VAR Prevod: String; VAR R: Recnik; VAR Ok: BOOLEAN); VAR Prethodni: Lista; BEGIN IF StranuNaDomacu THEN Nadji(Rec, R.Strane, Prethodni, Ok); ELSE Nadji(Rec, R.Domace, Prethodni, Ok); END; IF Ok THEN Prevod:= Prethodni^.Veza^.Prevod^.Rec; END END Prevedi; PROCEDURE Sadrzaj(VAR R: Recnik); VAR i: Indeksi; Tekuci: Lista; BEGIN WrStr('Sadrzaj recnika:'); FOR i:= 0 TO MaxTabela DO Tekuci:= R.Domace[i]^.Veza; WHILE Tekuci# R.Domace[i] DO WrLn; WrStr(Tekuci^.Rec); WrStr(' --------- '); WrStr(Tekuci^.Prevod^.Rec); Tekuci:= Tekuci^.Veza; END; END; END Sadrzaj; END RecnikATP.