2 (*-----------------------------------------------------------------------*)
\r
3 (* 2-3 tree J.Kujawski 1989-90 *)
\r
4 (*-----------------------------------------------------------------------*)
\r
10 srodkowy = ".ssyn" ;
\r
12 (*-----------------------------------------------------------------------*)
\r
18 (*-----------------------------------------------------------------------*)
\r
22 (*-----------------------------------------------------------------------*)
\r
30 Unit lisc : function :boolean ;
\r
32 result := lsyn = none
\r
38 (*-----------------------------------------------------------------------*)
\r
40 UNIT licznosc :function (d:drzewo , p:integer , log:boolean):integer ;
\r
42 (* Liczy ile miejsca potrzeba do wydruku linii *)
\r
44 Var licznik : integer ;
\r
49 Unit licz :procedure (d:drzewo) ;
\r
52 if d = none then raise alarm fi;
\r
54 if log then licznik := licznik + 1
\r
57 licznik := licznik + 6
\r
59 licznik := licznik + 3 ;
\r
63 call licz (d.lsyn) ;
\r
65 call licz(d.psyn.lsyn) ;
\r
66 call licz(d.psyn.psyn) ;
\r
75 when alarm : licznik := 0 ;
\r
86 (*-----------------------------------------------------------------------*)
\r
88 UNIT infix :procedure(d : drzewo) ;
\r
94 call infix (d.lsyn );
\r
95 call infix (d.psyn )
\r
99 (*-----------------------------------------------------------------------*)
\r
101 UNIT empty : function (d : drzewo) : boolean ;
\r
107 (*-----------------------------------------------------------------------*)
\r
109 UNIT minimum : function (d : drzewo) : integer ;
\r
118 result := minimum (d.lsyn)
\r
124 (*-----------------------------------------------------------------------*)
\r
126 UNIT member : function ( k:integer , d:drzewo ) : boolean ;
\r
130 if d.klucz <> k then
\r
131 if d.klucz < k then
\r
132 result := member(k,d.psyn);
\r
134 result := member(k,d.lsyn);
\r
144 (*-----------------------------------------------------------------------*)
\r
146 UNIT insert : procedure ( k : integer ; inout d : drzewo ) ;
\r
148 Var pom1,pom2 : drzewo ,
\r
149 max1,max2 : integer ;
\r
153 Unit ins : procedure ( a:drzewo ) ;
\r
155 if a.klucz = k then raise jest
\r
158 pom1 := new drzewo ;
\r
159 if a.klucz < k then
\r
163 pom1.klucz := a.klucz ;
\r
168 if k <= a.klucz then
\r
169 call ins (a.lsyn ) ;
\r
170 if pom1 <> none then
\r
186 a.logp,pom1.logl := false
\r
188 pom2 := new drzewo ;
\r
189 pom2.lsyn := pom1 ;
\r
190 pom2.psyn := a.psyn ;
\r
191 pom2.klucz := a.klucz ;
\r
193 pom2.logl,a.logp := true ;
\r
200 call ins (a.psyn) ;
\r
201 if pom1 <> none then
\r
204 a.psyn := a.psyn.lsyn ;
\r
205 pom2.lsyn := pom2.psyn ;
\r
206 pom2.psyn := pom1 ;
\r
208 max1 := pom2.klucz ;
\r
209 pom2.klucz := max2 ;
\r
211 pom1.logl,a.logp := false
\r
214 pom2 := new drzewo ;
\r
215 pom2.psyn := pom1 ;
\r
216 pom2.lsyn := a.psyn ;
\r
218 pom2.klucz := max1 ;
\r
219 a.logp,pom2.logl := true ;
\r
229 when jest : call setcursor(20,1) ;
\r
231 writeln("element ",k:2," already in this tree") ;
\r
232 call setcursor (25,30) ;
\r
234 write ("press any key") ;
\r
235 call cursorleft (1) ;
\r
238 call setcursor (25,30) ;
\r
240 call setcursor (20,1) ;
\r
251 if pom1 <> none then
\r
252 pom2 := new drzewo ;
\r
253 pom2.klucz := max1 ;
\r
255 pom2.psyn := pom1 ;
\r
261 (*-----------------------------------------------------------------------*)
\r
263 UNIT delete:procedure(k:integer;inout d:drzewo);
\r
265 Var pom,pom1 : drzewo ,
\r
266 nowymax : integer ,
\r
269 Signal koniec ,niema ;
\r
271 Unit del : procedure (inout d : drzewo ) ;
\r
275 if d.klucz = k then
\r
281 if d.klucz >= k then
\r
282 call del (d.lsyn) ;
\r
286 if d.lsyn = none then
\r
299 if k = d.klucz then
\r
303 if d.psyn.lsyn.logp then
\r
304 pom1 := d.psyn.lsyn ;
\r
305 d.psyn.lsyn := d.psyn.lsyn.psyn ;
\r
307 pom1.psyn := d.psyn ;
\r
308 d.psyn := pom1.lsyn ;
\r
311 d.logp,d.psyn.logl := false ;
\r
312 d.lsyn.logp , d.psyn.lsyn.logl := false ;
\r
317 d.psyn := d.psyn.lsyn ;
\r
321 d.lsyn.psyn.logl := true ;
\r
326 if d.psyn.logp then
\r
329 d.psyn := d.psyn.lsyn ;
\r
332 d.logp , d.psyn.logl := false ;
\r
333 if d.lsyn.logl then
\r
334 d.lsyn.logl := false ;
\r
341 d.psyn.logl , d.logp := true ;
\r
349 if k = d.klucz then d.klucz := nowymax fi;
\r
354 call del (d.psyn) ;
\r
358 if d.psyn = none then
\r
360 nowymax := d.lsyn.klucz ;
\r
367 d.psyn.logl := false ;
\r
370 if d.lsyn.logp then
\r
373 d.lsyn := pom1.psyn.psyn ;
\r
374 pom1.psyn.psyn := d ;
\r
376 pom1.psyn := d.lsyn ;
\r
378 d.logl , d.lsyn.logp := false ;
\r
383 d.lsyn := d.lsyn.psyn ;
\r
386 pom1.logp , pom1.psyn.logl := true ;
\r
397 when niema : call setcursor(20,1) ;
\r
398 writeln("There is no ",k:2," in the tree") ;
\r
399 call setcursor (25,30) ;
\r
401 write ("press any key") ;
\r
402 call cursorleft (1) ;
\r
405 call setcursor (25,30) ;
\r
407 call setcursor(20,1) ;
\r
410 when koniec : terminate
\r
418 if pom <> none then
\r
424 (*-----------------------------------------------------------------------*)
\r
426 Unit delmin : procedure (inout d : drzewo) ;
\r
439 (*-----------------------------------------------------------------------*)
\r
440 (* PROCEDURY prawie GRAFICZNE *)
\r
441 (* ----------------------------------------------------------------------*)
\r
444 unit Reverse : procedure;
\r
446 write( chr(27), "[7m")
\r
449 unit Normal : procedure;
\r
451 write( chr(27), "[0m")
\r
455 unit EraseLine : procedure;
\r
457 write( chr(27), "[K")
\r
460 unit inchar : IIUWgraph function : integer;
\r
461 (*podaj nr znaku przeslanego z klawiatury *)
\r
466 if i <> 0 then exit fi;
\r
471 unit NewPage : procedure;
\r
473 write( chr(27), "[2J")
\r
476 unit SetCursor : procedure(row, column : integer);
\r
477 var c,d,e,f : char,
\r
484 i := column div 10;
\r
485 j := column mod 10;
\r
488 write( chr(27), "[", c, d, ";", e, f, "H")
\r
491 unit CursorLeft : procedure (columns : integer);
\r
495 i := columns div 10;
\r
496 j := columns mod 10;
\r
499 write( chr(27), "[", e, f, "D")
\r
502 unit CursorRight : procedure (columns : integer);
\r
506 i := columns div 10;
\r
507 j := columns mod 10;
\r
510 write( chr(27), "[", e, f, "C")
\r
513 unit CursorUp : procedure (rows : integer);
\r
521 write( chr(27), "[", c, d, "A")
\r
524 unit CursorDown : procedure (rows : integer);
\r
532 write( chr(27), "[", c, d, "B")
\r
535 (*-----------------------------------------------------------------------*)
\r
537 UNIT czekaj :procedure ;
\r
543 (*-----------------------------------------------------------------------*)
\r
545 unit PrAnyKey : procedure;
\r
547 call setcursor (25,30) ;
\r
549 write ("press any key") ;
\r
550 call cursorleft (1) ;
\r
553 call setcursor (25,30) ;
\r
555 call setcursor(20,1) ;
\r
559 (*-----------------------------------------------------------------------*)
\r
560 UNIT tytul : procedure ;
\r
563 call setcursor (10,30) ;
\r
564 write ("PRIORITY QUEUE in 2-3 TREE ") ;
\r
565 call setcursor (15,32) ;
\r
566 write ("Author : Adam Kujawski") ;
\r
573 (*-----------------------------------------------------------------------*)
\r
575 UNIT menu : procedure ;
\r
577 Unit insdelmenu : procedure(formal : boolean) ;
\r
578 Var c1,c2,c3 : integer ;
\r
582 call setcursor (5,25) ;
\r
583 write ("Give a number x to insert ") ;
\r
584 call setcursor (7,25) ;
\r
585 write ( " 0 < x < 100 .") ;
\r
586 call setcursor (9,25) ;
\r
587 writeln (" 0 --- to terminate the operation") ;
\r
590 call setcursor(15,39);
\r
596 if c1 >= 48 andif c1 <= 57 then
\r
600 if c2 >= 48 andif c2 <= 57 then
\r
605 j := (c1-48) * 10 + (c2-48) ;
\r
610 call cursorleft(1) ;
\r
623 call cursorleft (1) ;
\r
633 if j < 100 andif j > 0 then
\r
635 call insert (j,node) ;
\r
637 call delete (j,node) ;
\r
639 call setcursor(20,1) ;
\r
650 (*----------------------------------------------------------------------*)
\r
652 Unit membermenu : procedure ;
\r
654 Var c1,c2,c3 : integer ,
\r
659 call setcursor (5,25) ;
\r
660 write ("Give a number x ") ;
\r
661 call setcursor (7,25) ;
\r
662 write ( " 0 < x < 100 .") ;
\r
663 call setcursor (9,25) ;
\r
664 writeln (" 0 --- to terminate the operation") ;
\r
667 call setcursor(15,39);
\r
673 if c1 >= 48 andif c1 <= 57 then
\r
677 if c2 >= 48 andif c2 <= 57 then
\r
682 j := (c1-48) * 10 + (c2-48) ;
\r
687 call cursorleft(1) ;
\r
700 call cursorleft (1) ;
\r
710 if j < 100 andif j > 0 then
\r
711 bool1 := member (j,node) ;
\r
712 call setcursor (20,20) ;
\r
714 write(" Element ",j:2," exists already in the tree.")
\r
716 write (" There is no ",j:2," in the tree.")
\r
726 (*-----------------------------------------------------------------------*)
\r
728 Unit help : procedure ;
\r
732 call setcursor (7,1) ;
\r
733 write (" If you do not know : ") ;
\r
734 write (" ^d = 'Ctrl' + 'd' .") ;
\r
738 (*-----------------------------------------------------------------------*)
\r
739 Unit emptymenu : procedure ;
\r
743 bo := empty (node) ;
\r
744 call setcursor (12,25) ;
\r
746 write ( "The tree is empty.") ;
\r
748 write ("This is not empty tree.") ;
\r
752 (*------------------------------------------------------------------------*)
\r
754 Unit minimummenu:procedure ;
\r
757 if empty (node) then
\r
760 x := minimum(node) ;
\r
762 call setcursor(12,20) ;
\r
763 write ("A minimal element of the tree : ",x:2," .") ;
\r
767 (*---------------------------------------------------------------------*)
\r
769 Unit rysmenu :procedure ;
\r
771 Unit listawezlow : class ;
\r
774 next,pop : listawezlow ;
\r
777 Var aktualny : listawezlow ,
\r
778 pom : listawezlow ;
\r
781 aktualny := new listawezlow ;
\r
782 aktualny.dr := node ;
\r
785 call setcursor (10,30);
\r
787 write (" S U B M E N U ") ;
\r
789 call setcursor (13,27);
\r
790 write ("-> , <- - to change the actual tree") ;
\r
791 call setcursor (14,27);
\r
792 write ("enter - draw the actual tree") ;
\r
793 call setcursor (15,27);
\r
794 write ("Esc - return to M E N U") ;
\r
795 call setcursor (25,1);
\r
796 write ("actual = root") ;
\r
798 while pom.pop <> none
\r
802 while pom.next <> none
\r
805 when 1 : write (lewy) ;
\r
806 when 2 : write (srodkowy) ;
\r
807 when 3 : write (prawy)
\r
816 when 27 : exit exit
\r
820 when 8 : if aktualny.dr <> node then
\r
821 aktualny := aktualny.pop ;
\r
822 call cursorleft(5) ;
\r
824 kill (aktualny.next) ;
\r
827 when 5 :if aktualny.dr <> none then
\r
828 pom := new listawezlow ;
\r
829 pom.pop := aktualny ;
\r
830 pom.dr := aktualny.dr.lsyn ;
\r
831 aktualny.next := pom ;
\r
832 aktualny.kier := 1 ;
\r
836 when 3 :if aktualny.dr <> none then
\r
837 pom := new listawezlow ;
\r
838 pom.pop := aktualny ;
\r
839 if aktualny.dr.logp then
\r
840 pom.dr := aktualny.dr.psyn.psyn
\r
842 pom.dr := aktualny.dr.psyn
\r
844 aktualny.next := pom ;
\r
845 aktualny.kier := 3 ;
\r
849 when 0 :if aktualny.dr <> none then
\r
850 if aktualny.dr.logp then
\r
851 pom := new listawezlow ;
\r
852 pom.pop := aktualny ;
\r
853 aktualny.next := pom ;
\r
854 pom.dr := aktualny.dr.psyn.lsyn ;
\r
855 aktualny.kier := 2 ;
\r
864 call rys (aktualny.dr)
\r
868 (*--------------------------------------------------------------------*)
\r
873 call setcursor (13,31);
\r
875 write (" M E N U ") ;
\r
877 call setcursor (13,30);
\r
878 write ("i - insert") ;
\r
879 call setcursor (14,30);
\r
880 write ("d - delete");
\r
881 call setcursor (15,30);
\r
882 write ("m - member" );
\r
883 call setcursor (16,30);
\r
884 write ("e - empty?") ;
\r
885 call setcursor (17,30);
\r
886 write ("w - draw tree");
\r
887 call setcursor (18,30);
\r
888 write ("^m - minimum");
\r
889 call setcursor (19,30);
\r
890 write ("^d - delmin");
\r
892 call setcursor (25,1);
\r
893 write (" F1 - HELP , Esc - end of the execution ");
\r
903 when 105 : call insdelmenu(true) ;
\r
904 when 100 : call insdelmenu(false) ;
\r
905 when 109 : call membermenu ;
\r
906 when 101 : call emptymenu ;
\r
907 when 119 : call rysmenu ;
\r
912 when 64 : call delmin (node) ;
\r
913 when 73 : call minimummenu ;
\r
914 when 1 : call help ;
\r
924 (*-----------------------------------------------------------------------*)
\r
925 (*-----------------------------------------------------------------------*)
\r
927 UNIT rys:IIUWGraph procedure(d:drzewo) ;
\r
931 Var licznik,poziom,licznik2 : integer ,
\r
932 krok,krok2,staryx,staryy : integer ;
\r
935 Unit ramka :procedure (wr,kol,dl:integer) ;
\r
936 Var x1,y1,l,h :integer ;
\r
938 x1 := (wr) * 8 - 2 ;
\r
939 y1 := (kol) * 8 -2 ;
\r
942 call move (x1,y1) ;
\r
943 call draw (x1+l,y1) ;
\r
944 call draw (x1+l,y1+h) ;
\r
945 call draw (x1,y1+h) ;
\r
946 call draw (x1,y1) ;
\r
947 call move (x1 + l div 2,y1) ;
\r
948 call draw (staryx ,staryy ) ;
\r
949 call move (x1+2,y1+2)
\r
952 Unit print : procedure (a : integer) ;
\r
955 call hascii (48 + a div 10)
\r
957 call hascii (48 + a mod 10)
\r
960 Unit odstep : function(d :drzewo,poziom :integer) : integer ;
\r
961 var i,j : integer ;
\r
964 j := licznosc (d,poziom,true) ;
\r
965 i := licznosc (d,poziom,false) ;
\r
966 result :=( 85 - i ) div (j+1)
\r
969 Unit linia :procedure (d:drzewo);
\r
971 (* poziom = drukowany poziom *)
\r
972 (* i - numer poziomu *)
\r
976 if poziom - 1 = i then
\r
978 staryx := licznik2 * 8 + 20;
\r
979 staryy := i * skok * 8 + 10 ;
\r
980 licznik2 := licznik2 + 6 + krok2
\r
982 staryx := licznik2 * 8 + 8;
\r
983 staryy := i * skok * 8 + 10 ;
\r
984 licznik2 := licznik2 + 3 +krok2
\r
989 call ramka (licznik, poziom*skok ,5) ;
\r
990 call print (d.klucz) ;
\r
992 call print (d.psyn.klucz) ;
\r
993 licznik := licznik + 6 + krok
\r
995 call ramka (licznik, poziom*skok ,2) ;
\r
996 call print (d.klucz) ;
\r
997 licznik := licznik + 3 + krok
\r
1000 call linia (d.lsyn) ;
\r
1002 call linia(d.psyn.lsyn) ;
\r
1003 call linia(d.psyn.psyn) ;
\r
1005 call linia(d.psyn)
\r
1011 Unit napis1 : procedure ;
\r
1013 call move ( 275 ,335) ;
\r
1014 call hascii (78) ;
\r
1015 call hascii (97) ;
\r
1016 call hascii (99) ;
\r
1017 call hascii (105) ;
\r
1018 call hascii (115) ;
\r
1019 call hascii (110) ;
\r
1020 call hascii (105) ;
\r
1021 call hascii (106) ;
\r
1022 call hascii (32) ;
\r
1023 call hascii (99) ;
\r
1024 call hascii (111) ;
\r
1025 call hascii (107) ;
\r
1026 call hascii (111) ;
\r
1027 call hascii (108) ;
\r
1028 call hascii (119) ;
\r
1029 call hascii (105) ;
\r
1030 call hascii (101) ;
\r
1035 Unit napis2 : procedure ;
\r
1037 call move ( 275 ,300) ;
\r
1038 call hascii (66) ;
\r
1039 call hascii (114) ;
\r
1040 call hascii (97) ;
\r
1041 call hascii (107) ;
\r
1042 call hascii (32) ;
\r
1043 call hascii (109) ;
\r
1044 call hascii (105) ;
\r
1045 call hascii (101) ;
\r
1046 call hascii (106) ;
\r
1047 call hascii (115) ;
\r
1048 call hascii (99) ;
\r
1053 Unit napis3 : procedure ;
\r
1056 call move ( 285 ,300) ;
\r
1057 call hascii (79) ;
\r
1058 call hascii (46) ;
\r
1059 call hascii (75) ;
\r
1060 call hascii (46) ;
\r
1068 j := licznosc(d,poziom,false) ;
\r
1069 if j>0 andif j<82 then
\r
1071 krok2 := odstep (d,poziom-1) ;
\r
1072 krok := odstep (d,poziom) ;
\r
1073 licznik := krok + 1 ;
\r
1074 licznik2 :=krok2 + 1 ;
\r
1076 staryy := skok * 8 -2 ;
\r
1078 poziom := poziom+1
\r
1093 (*-----------------------------------------------------------------------*)
\r
1096 when emptytree : call newpage ;
\r
1097 call setcursor(12,30) ;
\r
1098 write ("EMPTY TREE !") ;
\r
1101 call setcursor (25,30) ;
\r
1103 write ("nacisnij cokolwiek") ;
\r
1104 call cursorleft (1) ;
\r
1109 (*-----------------------------------------------------------------------*)
\r
1110 (* program glowny *)
\r
1111 (*-----------------------------------------------------------------------*)
\r