Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2014
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Modula 2 18.33 KB | None | 0 0
  1. MODULE stabla;
  2. FROM FIO IMPORT File, Exists, Open, Create, Close,RdInt, RdChar,WrInt,WrStr,WrLn,WrChar;
  3. FROM InOut IMPORT WriteInt, WriteString, WriteLn, ReadString, Write, ReadInt;
  4. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  5. FROM Str IMPORT Length;
  6.  
  7. TYPE
  8.         string = ARRAY [1..40] OF CHAR;
  9. TYPE
  10.         InfoTip = INTEGER;
  11.  
  12. CONST
  13.         MAXINFOTIP = MAX(InfoTip);
  14.         MININFOTIP = MIN(InfoTip);
  15.        
  16. PROCEDURE FRdInfo(f:File; VAR info:InfoTip);
  17. BEGIN
  18.                 info := RdInt(f);
  19. END FRdInfo;
  20.  
  21. PROCEDURE WrInfo(info:InfoTip);
  22. BEGIN
  23.                 WriteInt(info,3);
  24. END WrInfo;
  25.  
  26. PROCEDURE FWrInfo(f:File; info:InfoTip);
  27. BEGIN
  28.                 WrInt(f,info,2);
  29. END FWrInfo;
  30.  
  31. TYPE
  32.         Stablo = POINTER TO cvor;
  33.         cvor = RECORD
  34.                 id : INTEGER;
  35.                 info : InfoTip;
  36.                 levo : Stablo;
  37.                 desno : Stablo;
  38.         END;
  39.  
  40. PROCEDURE Nadji(s:Stablo; id:INTEGER):Stablo;
  41. VAR
  42.         temp : Stablo;
  43. BEGIN
  44.         IF (s= NIL) THEN
  45.                 RETURN NIL;
  46.         ELSIF (s^.id = id) THEN
  47.                 RETURN s;
  48.         ELSE
  49.                 temp := Nadji(s^.levo,id);
  50.                 IF temp#NIL THEN
  51.                         RETURN temp;
  52.                 ELSE                        
  53.                         temp:= Nadji(s^.desno,id);
  54.                         RETURN temp;
  55.                 END;
  56.         END;
  57. END Nadji;    
  58.  
  59. PROCEDURE DodajCvor(VAR s:Stablo; id:INTEGER; info: InfoTip; levo, desno :INTEGER):BOOLEAN;
  60. VAR
  61.         cv, novi : Stablo;
  62.         postoji : BOOLEAN;
  63. BEGIN
  64.         IF s=NIL THEN
  65.                 NEW(s);
  66.                 s^.id := id;
  67.                 cv := s;
  68.                 postoji := TRUE;
  69.         ELSE
  70.             cv := Nadji(s, id);
  71.             postoji := cv#NIL;
  72.         END;  
  73.  
  74.         IF postoji THEN              
  75.                 cv^.info := info;            
  76.                 IF levo>0 THEN
  77.                         NEW(novi);
  78.                         cv^.levo:=novi;
  79.                         novi^.id:=levo;
  80.                         novi^.levo:=NIL;
  81.                         novi^.desno:=NIL;
  82.                 END;
  83.                 IF desno>0 THEN
  84.                         NEW(novi);
  85.                         cv^.desno:=novi;
  86.                         novi^.id:=desno;
  87.                         novi^.levo:=NIL;
  88.                         novi^.desno:=NIL;
  89.                 END;
  90.         RETURN TRUE;
  91.        
  92.     ELSE
  93.         RETURN FALSE;  
  94.     END;
  95. END DodajCvor;
  96.  
  97. PROCEDURE Ucitaj(fn: string; VAR s: Stablo):BOOLEAN;
  98. VAR
  99.         i,n : INTEGER;
  100.         info : InfoTip;
  101.         id, levo, desno : INTEGER;
  102.         f: File;
  103. BEGIN
  104.         IF Exists(fn) THEN
  105.                 f := Open(fn);
  106.                 n := RdInt(f);
  107.                 FOR i:= 1 TO n DO
  108.                         id := RdInt(f); (*sve je integer osim info koji je infotip*)
  109.                         FRdInfo(f,info);
  110.                         levo := RdInt(f);
  111.                         desno := RdInt(f);
  112.                         IF NOT DodajCvor(s,id,info,levo,desno) THEN
  113.                                 WriteString("Greska: unos, definicija ");
  114.                                 WriteInt(i,2);
  115.                                 WriteLn;
  116.                         END;
  117.                 END;
  118.                 Close(f);
  119.                 RETURN TRUE;
  120.         ELSE
  121.                 RETURN FALSE;
  122.         END;
  123. END Ucitaj;
  124.  
  125. PROCEDURE Stampaj(s: Stablo);
  126. BEGIN
  127.         IF s#NIL THEN
  128.                 WriteInt(s^.id,0);
  129.                 WriteString(" ");
  130.                 WrInfo(s^.info);
  131.                 WriteString(" ");
  132.                 IF s^.levo#NIL THEN
  133.                         WriteInt(s^.levo^.id,0);
  134.                 ELSE
  135.                         WriteInt(0, 0);
  136.                 END;
  137.                 WriteString(" ");
  138.                 IF s^.desno#NIL THEN
  139.                         WriteInt(s^.desno^.id,0);
  140.                 ELSE
  141.                         WriteInt(0,0);
  142.                 END;
  143.                 WriteLn;
  144.                 Stampaj(s^.levo); (* stampa levo i desno rekurzivna*)
  145.                 Stampaj(s^.desno);
  146.         END;
  147. END Stampaj;
  148.  
  149. PROCEDURE StampajNivoe(s: Stablo; dubina:INTEGER; VAR brp:INTEGER);
  150. VAR
  151.         i:INTEGER;
  152. BEGIN
  153.         IF s#NIL THEN (* Ovaj deo koda prebrojava parne cvorove *)
  154.                 IF (s^.info MOD 2 = 0 ) THEN
  155.                         INC (brp);
  156.                 END;
  157.                
  158.                 StampajNivoe(s^.desno,dubina+1,brp);
  159.                 FOR i:=1 TO dubina-1 DO
  160.                         WriteString("   |    ");
  161.                 END;
  162.                 IF dubina>0 THEN
  163.                         WriteString("   |--->");
  164.                 END;
  165.                 WriteString("(");
  166.                 WriteInt(s^.id,2);
  167.                 WriteString(":");
  168.                 WrInfo(s^.info);
  169.                 WriteString(")");WriteLn;              
  170.                 StampajNivoe(s^.levo,dubina+1,brp);
  171.         END;
  172. END StampajNivoe;
  173.  
  174. PROCEDURE ObilazakStabla (s : Stablo);
  175. VAR temp: stablo;
  176. BEGIN
  177.         temp:=s;
  178.         IF s # NIL THEN
  179.                 IF (s^.levo # NIL) THEN
  180.                         ObilazakStabla (s^.levo);
  181.                 END;
  182.                 IF (s^.desno # NIL) THEN
  183.                         ObilazakStabla (s^.desno);
  184.                 END;
  185.         END;          
  186.        
  187. END ObilazakStabla;
  188.  
  189. PROCEDURE StampajUDubinu(s: Stablo; dubina:INTEGER);
  190. VAR
  191.         i:INTEGER;
  192. BEGIN
  193.         IF s#NIL THEN
  194.                 FOR i:=1 TO dubina-1 DO
  195.                         WriteString("   |    ");
  196.                 END;
  197.                 IF dubina>0 THEN
  198.                         WriteString("   |--->");
  199.                 END;
  200.                 WriteString("(");
  201.                 WriteInt(s^.id,2);
  202.                 WriteString(":");
  203.                 WrInfo(s^.info);
  204.                 WriteString(")");WriteLn;              
  205.                 StampajUDubinu(s^.levo,dubina+1);
  206.                 StampajUDubinu(s^.desno,dubina+1);
  207.         END;
  208. END StampajUDubinu;
  209.  
  210. PROCEDURE Unisti(VAR s: Stablo);
  211. BEGIN
  212.         IF (s#NIL) THEN
  213.                 Unisti(s^.levo);
  214.                 Unisti(s^.desno);
  215.                 DISPOSE(s); (* postavlja i s na NIL *)
  216.         END;
  217. END Unisti;
  218.  
  219. PROCEDURE Prebroj(s:Stablo):INTEGER;
  220. BEGIN
  221.         IF s#NIL THEN
  222.                 RETURN 1 + Prebroj(s^.levo) + Prebroj(s^.desno);
  223.         ELSE
  224.                 RETURN 0;
  225.         END;
  226. END Prebroj;
  227.  
  228. PROCEDURE Snimi(fn:string; s: Stablo);
  229.        
  230.         PROCEDURE SnimiCvor(f:File;s:Stablo);
  231.         BEGIN
  232.                 IF s#NIL THEN
  233.                         WrInt(f,s^.id,4);
  234.                         WrStr(f," ");
  235.                         FWrInfo(f,s^.info);
  236.                         WrStr(f," ");
  237.                         IF s^.levo#NIL THEN
  238.                                 WrInt(f,s^.levo^.id,4);
  239.                         ELSE
  240.                                 WrInt(f, 0, 4);
  241.                         END;
  242.                         WrStr(f," ");
  243.                         IF s^.desno#NIL THEN
  244.                                 WrInt(f,s^.desno^.id,4);
  245.                         ELSE
  246.                                 WrInt(f, 0 ,4);
  247.                         END;
  248.                         WrLn(f);
  249.                         SnimiCvor(f,s^.levo);
  250.                         SnimiCvor(f,s^.desno);
  251.                 END;
  252.         END SnimiCvor;
  253. VAR
  254.         f:File;
  255.         i:INTEGER;
  256. BEGIN
  257.         f := Create(fn);
  258.         (* treba proveriti koliko je veliko Stablo *)
  259.         i := Prebroj(s);
  260.         WrInt(f,i,0);
  261.         WrLn(f);
  262.         SnimiCvor(f,s);
  263.         Close(f);
  264. END Snimi;
  265.  
  266. PROCEDURE SnimiId(fn:string;s:Stablo;id:INTEGER);
  267. BEGIN
  268.         IF id>0 THEN
  269.                 Snimi(fn,Nadji(s,id));
  270.         ELSE
  271.                 Snimi(fn,s);
  272.         END;
  273. END SnimiId;
  274.  
  275. PROCEDURE Visina(s : Stablo) : INTEGER;
  276. VAR
  277.         l, d : INTEGER;
  278. BEGIN
  279.         IF s # NIL THEN
  280.                 l := Visina( s^.levo );
  281.                 d := Visina( s^.desno );
  282.                 IF l > d THEN
  283.                         RETURN l + 1;
  284.                 ELSE
  285.                         RETURN d + 1;
  286.                 END;
  287.         END;
  288.         RETURN -1;
  289. END Visina;
  290.  
  291. PROCEDURE Obilazak ( s : Stablo; VAR max:INTEGER);    
  292. BEGIN
  293.         IF s # NIL THEN
  294.                 IF (s^.levo # NIL) THEN
  295.                         IF (s^.levo^.info > max) THEN
  296.                                 max:=s^.levo^.info;
  297.                         END;
  298.                         Obilazak (s^.levo,max);
  299.                 END;
  300.                 IF (s^.desno # NIL) THEN
  301.                         IF (s^.desno^.info > max) THEN
  302.                                 max:=s^.desno^.info;
  303.                         END;
  304.                         Obilazak(s^.desno,max);
  305.                 END;
  306.         END;          
  307.        
  308. END Obilazak;
  309.  
  310. PROCEDURE Obrni ( s : Stablo);
  311. VAR
  312.         temp:Stablo;  
  313. BEGIN
  314.         IF s <> NIL THEN
  315.                 IF (s^.levo^.info = s^.info ) THEN
  316.                         temp:=s^.levo;
  317.                         s^.levo:=s^.desno;
  318.                         s^.desno:=temp;
  319.                         Obrni(s^.levo);
  320.                 END;
  321.                 IF  (s^.desno^.info = s^.info) THEN
  322.                         temp:=s^.levo;
  323.                         s^.levo:=s^.desno;
  324.                         s^.desno:=temp;
  325.                         Obrni(s^.desno);
  326.                 END;
  327.         END;          
  328.        
  329. END Obrni;
  330.  
  331. PROCEDURE VisljePodStablo ( s : Stablo);
  332. VAR
  333.         l,d:INTEGER;
  334.        
  335. BEGIN
  336.         IF s # NIL THEN
  337.                 l:=Visina (s^.levo);
  338.                 d:=Visina (s^.desno);
  339.                 IF (l>d) THEN
  340.                         WriteInt (s^.id,2);
  341.                         WriteString ("  ");
  342.                 END;
  343.                 VisljePodStablo(s^.levo);
  344.                 VisljePodStablo(s^.desno);
  345.         END;          
  346.        
  347. END VisljePodStablo;
  348.  
  349. PROCEDURE Duplikatikorena ( s : Stablo; br: INTEGER; VAR d:INTEGER);
  350.        
  351. BEGIN
  352.         IF s <> NIL THEN
  353.        
  354.                 IF (s^.levo <> NIL) THEN
  355.                         IF (s^.levo^.info = br) THEN
  356.                                 INC(d);
  357.                         END;
  358.                                 Duplikatikorena(s^.levo,br,d);
  359.                 END;
  360.                 IF  (s^.desno <> NIL) THEN
  361.                         IF (s^.desno^.info = br) THEN
  362.                                 INC(d)
  363.                         END;
  364.                                 Duplikatikorena(s^.desno,br,d);
  365.                 END;
  366.         END;          
  367.        
  368. END Duplikatikorena;
  369.  
  370. PROCEDURE IspisBrCv(s : Stablo; k:INTEGER);
  371. VAR
  372.  
  373.  pom : Stablo;
  374.  brcv : INTEGER;
  375. BEGIN
  376.         pom := Nadji(s,k);
  377.         IF pom <> NIL THEN
  378.                 brcv := (Prebroj(pom));
  379.         END;
  380.         WriteString("Broj cvorova u podstablu je:  ");
  381.         WriteInt(brcv,1);
  382.  
  383. END IspisBrCv;
  384.  
  385. PROCEDURE VecePodStablo (s:Stablo; k:INTEGER);
  386. VAR
  387.         lev,des:INTEGER;
  388.         pom:Stablo;
  389. BEGIN
  390.                 pom := Nadji(s, k);
  391.                 lev := Visina(pom^.levo);
  392.                 des := Visina(pom^.desno);
  393.                 IF lev > des THEN
  394.                         WriteString("Vece je levo podStablo.");
  395.                 ELSIF des>lev  THEN
  396.                         WriteString("Vece je desno podStablo.");
  397.                 ELSE
  398.                         WriteString ("Podstabla su jednake visine.");
  399.                 END;
  400.                 WriteLn; WriteLn;
  401. END VecePodStablo;
  402.  
  403. PROCEDURE obrisi (s:Stablo; id:INTEGER);
  404. VAR
  405.         temp:Stablo;
  406. BEGIN
  407.         temp:=Nadji(s,id);
  408.         Unisti(temp);
  409.         WriteString ("PodStablo cvora sa id ");
  410.         WriteInt (id,3);
  411.         WriteString ("je obrisano.");
  412. END obrisi;
  413.  
  414. PROCEDURE IspisNaDubini(s : Stablo; dubina : INTEGER );
  415.  
  416.         PROCEDURE uradi( sta : Stablo; d : INTEGER );
  417.         BEGIN
  418.                 IF sta = NIL THEN
  419.                         RETURN
  420.                 END;
  421.        
  422.                 IF d < dubina THEN
  423.                         uradi( sta^.levo , d + 1 );
  424.                         uradi( sta^.desno , d + 1 );
  425.                 END;
  426.        
  427.                 IF d = dubina THEN
  428.                         WriteInt( sta^.info, 0 );
  429.                         WriteString (",");
  430.                 END;
  431.         END uradi;
  432.        
  433. BEGIN
  434.         uradi( s, 0 );
  435. END IspisNaDubini;
  436.  
  437. PROCEDURE Vrednost( s : Stablo ): INTEGER;
  438. BEGIN
  439.         IF s <> NIL THEN
  440.                 RETURN s^.info + Vrednost(s^.levo) + Vrednost(s^.desno);      
  441.         END;
  442.         RETURN 0;
  443. END Vrednost;
  444.  
  445. PROCEDURE VrP( s : Stablo);
  446.        
  447. BEGIN
  448.         IF s <> NIL THEN
  449.        
  450.                 IF (s^.levo <> NIL) THEN
  451.                         WriteString ("Vrednost podstabla cvora sa id ")  ;
  452.                         WriteInt (s^.levo^.id,2);
  453.                         WriteString ("je: ");
  454.                         WriteInt (Vrednost(s),2);
  455.                         WriteLn;
  456.                         VrP(s^.levo);
  457.                 END;
  458.                 IF  (s^.desno <> NIL) THEN
  459.                         WriteString ("Vrednost podstabla cvora sa id ");
  460.                         WriteInt (s^.desno^.id,2);
  461.                         WriteString ("je: ");
  462.                         WriteInt (Vrednost(s),2);
  463.                         WriteLn;
  464.                         VrP(s^.desno);
  465.                 END;
  466.         END;          
  467.        
  468. END VrP;
  469.  
  470. PROCEDURE VeciOdRoditelja( s : Stablo);
  471.        
  472. BEGIN
  473.         IF s <> NIL THEN
  474.        
  475.                 IF (s^.levo <> NIL) THEN
  476.                         IF (s^.levo^.info > s^.info ) THEN
  477.                                 WriteInt (s^.levo^.id,2);
  478.                         END;
  479.                         VeciOdRoditelja (s^.levo);
  480.                 END;
  481.                 IF  (s^.desno <> NIL) THEN
  482.                         IF (s^.desno^.info > s^.info ) THEN
  483.                                 WriteInt (s^.desno^.id,2);
  484.                         END;
  485.                         VeciOdRoditelja(s^.desno);
  486.                 END;
  487.         END;          
  488.        
  489. END VeciOdRoditelja;
  490.  
  491. VAR
  492.         s: Stablo;
  493.         fn: string;
  494.         id,brp,k,d: INTEGER;
  495. BEGIN
  496.         (* init na prazno Stablo *)
  497.         s := NIL;
  498.         brp:=0;
  499.         WriteString("ime fajla sa Stablom (podrazumevano s2.txt) ? ");
  500.         WriteLn;
  501.         ReadString(fn);
  502.         (* podrazumevano ime za brze testiranje *)
  503.         IF Length(fn)=0 THEN
  504.                 fn := "s2.txt";
  505.         END;
  506.        
  507.         IF Ucitaj(fn, s) THEN
  508.                 WriteString ("---------OSNOVNE INFORMACIJE O STABLU---------");
  509.                 WriteLn; WriteLn;
  510.                
  511.                 WriteString("Ukupan broj cvorova unetog stabla je :");
  512.                 WriteInt(Prebroj(s),0);
  513.                 WriteLn;
  514.                 WriteLn;
  515.                
  516.                 WriteString("Visina stabla je : ");
  517.                 WriteInt(Visina(s), 3);
  518.                 WriteLn;WriteLn;
  519.  
  520.                 WriteString("Vrednost stabla je : ");
  521.                 WriteInt(Vrednost(s),3);
  522.                 WriteLn;WriteLn;
  523.  
  524.                 WriteString ("-----------STAMPANJE POGODNO ZA UCITAVANJE IZ FAJLA-------------" );
  525.                 WriteLn; WriteLn;
  526.                 Stampaj(s);
  527.                 WriteLn;
  528.                
  529.                
  530.                 WriteString ("------------STAMPANJE STABLA PO NIVOIMA-----------");
  531.                 WriteLn;
  532.                 WriteLn;
  533.                 StampajNivoe(s,0,brp);
  534.                 WriteLn;
  535.                 WriteLn;
  536.  
  537.                 WriteString ("---------DODATNE INFORMACIJE O STABLU--------");
  538.                 WriteLn; WriteLn;
  539.                
  540.                 WriteString ("Broj parnih cvorova je: ");
  541.                 WriteInt (brp,1);
  542.                 WriteLn; WriteLn;
  543.                
  544.                 WriteString ("Maximalni element u stablu: ");
  545.                 Obilazak (s,brp);
  546.                 WriteInt (brp,2);
  547.                 WriteLn;
  548.                 WriteLn;
  549.                
  550.                 WriteString ("Stampaj sve cvorove na dubini 3:");
  551.                 IspisNaDubini (s,3);
  552.                 WriteLn; WriteLn;              
  553.                
  554.                 WriteString  ("Sumiranje podstabala cvorova (odnosi se na podstabla koji imaju bar jedan cvor): ");
  555.                 WriteLn;
  556.                 VrP(s);
  557.                 WriteLn;
  558.                 WriteLn;
  559.                
  560.                 WriteString (" Ispisujemo sve id cvorova kod kojih je vece levo podStablo: ");
  561.                 VisljePodStablo (s);
  562.                 WriteLn;
  563.                 WriteLn;
  564.                
  565.                 WriteString ("Ispisujemo sve cvorove koji imaju vecu vrednost od roditelja: ");
  566.                 VeciOdRoditelja(s);
  567.                 WriteLn; WriteLn;
  568.                
  569.                 WriteString ("Da vidimo da li ima duplikata korena u nasem stablu: ");
  570.                 Duplikatikorena(s,s^.info,d);
  571.                 WriteInt (d,2);
  572.                 WriteLn;
  573.                 WriteLn;
  574.                
  575.                 WriteString("Unesite id cvora, za koji zelite da znate broj cvorova podstabla : ");
  576.                 ReadInt (k);
  577.                 WriteLn;
  578.                 IspisBrCv (s,k);
  579.                 WriteLn; WriteLn;
  580.                
  581.                
  582.                 WriteString ("Obrnucemo sva podstabla cvorova koji imaju isti info kao u korenu." );
  583.                 Obrni(s);
  584.                 WriteLn;
  585.                 StampajNivoe (s,d,brp);
  586.                 WriteLn; WriteLn;
  587.                        
  588.                 WriteString("Unesite id  cvora, za koji zelite da znate koje njegovo koje podStablo ima vecu visinu: ");
  589.                 ReadInt(k);
  590.                 VecePodStablo (s,k);
  591.                
  592.                 WriteString ("Unesite id cvora cija podstabla zelite da obrisete: ");
  593.                 ReadInt (k);
  594.                 obrisi(s,k);
  595.                 WriteLn;
  596.                 StampajNivoe (s,d,brp);
  597.                 WriteLn; WriteLn;
  598.  
  599.                 WriteString("Snimamo podStablo u fajl podStablo.txt - unesite id korena ili 0 za celo Stablo: ");
  600.                 ReadInt(id);
  601.                 SnimiId("podStablo.txt",s,id);
  602.                 Unisti(s);
  603.                 WriteLn;
  604.                 WriteString("oslobodjena memorija; kraj rada");
  605.                 WriteLn;
  606.         ELSE
  607.                 WriteString("greska u ucitavanju");
  608.                 WriteLn;
  609.         END;
  610. END stabla.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement