X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=spa2-teorijske-vezbe.git;a=blobdiff_plain;f=01.%20Dvosmerni%20recnik%2FXDS%2FRECNIKATP.MOD;fp=01.%20Dvosmerni%20recnik%2FXDS%2FRECNIKATP.MOD;h=197789342bcbc5293eabe0e430e2e7ff358f8251;hp=0000000000000000000000000000000000000000;hb=8a74ce20c68b61b8992a348e34c43671116e9549;hpb=a35f3e51789ace81cea01e548963568da918635f diff --git a/01. Dvosmerni recnik/XDS/RECNIKATP.MOD b/01. Dvosmerni recnik/XDS/RECNIKATP.MOD new file mode 100644 index 0000000..1977893 --- /dev/null +++ b/01. Dvosmerni recnik/XDS/RECNIKATP.MOD @@ -0,0 +1,186 @@ +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.