3 (* Projet LI1 : Operations sur les arbres bicolores . *)
\r
4 (* Realise par CHICHER Corinne et DOME Nadege - UPPA 1993/1994 - *)
\r
7 (* NewPage vide l'ecran en mode texte *)
\r
8 UNIT NewPage : PROCEDURE;
\r
10 write( chr(27), "[2J")
\r
13 (* SetCursor positionne le curseur aux ligne et colonne indiquees *)
\r
14 UNIT SetCursor : PROCEDURE(ligne,colonne:integer);
\r
26 write( chr(27), "[", c, d, ";", e, f, "H");
\r
30 (* la classe bic definit la structure d'un noeud d'arbre bicolore *)
\r
32 VAR val:integer, (* val:Valeur de l'element d'un noeud *)
\r
33 rouge : boolean, (* rouge:couleur d'un noeud:si vrai alors rouge sinon blanc *)
\r
34 fg,fd : bic; (* fg,fd:fils gauche et droit d'un noeud *)
\r
38 (* inchar saisit un caractere en mode graphique *)
\r
39 UNIT inchar : iiuwgraph FUNCTION : integer;
\r
51 (* ReadInteger lit un entier positif a 3 chiffres avec echo a l'ecran *)
\r
52 UNIT ReadInteger : iiuwgraph FUNCTION : integer;
\r
53 VAR X,Y,i,OrdN : integer,
\r
54 Number : arrayof integer;
\r
56 array Number dim( 1 : 4 );
\r
62 if i=8 or (OrdN < 48 and OrdN > 57) then
\r
86 when 8 : if i > 0 then
\r
91 when 13 : if i > 0 then
\r
98 call hascii(48+Number(1));
\r
103 call hascii(48+Number(2));
\r
108 call hascii(48+Number(3));
\r
111 if (Number(1) = 0) or (Number(1) = 0 and Number(2) = 0)
\r
112 or (Number(1) = 0 and Number(2) = 0 and Number(3) = 0) then
\r
122 result:=10 * Number(1) + Number(2);
\r
124 result:=100 * Number(1) + 10 * Number(2) + Number(3);
\r
130 (* WriteInteger permet d'afficher un entier positif a 3 chiffres a l'ecran *)
\r
131 UNIT WriteInteger : iiuwgraph PROCEDURE(Number:integer);
\r
134 if Number < 10 then
\r
136 call HASCII(Number+48);
\r
139 if Number < 100 then
\r
141 j:=Number - i * 10;
\r
148 j:=(Number - i * 100) div 10;
\r
149 k:=Number - i * 100 - j * 10;
\r
160 (* Mousepos gere la position de la souris a l'endroit ou le bouton gauche *)
\r
162 UNIT MOUSEPOS : iiuwgraph PROCEDURE(x,y:integer;inout bonclic:boolean;output choix:integer);
\r
164 if (x >= 24) and (x <= 544) then
\r
165 if (y >= 80) and (y <= 88) then
\r
169 if (y >= 96) and (y <= 104) then
\r
173 if (y >= 112) and (y <= 120) then
\r
177 if (y >= 128) and (y <= 136) then
\r
181 if (y >= 144) and (y <=152) then
\r
185 if (y >= 160) and (y <= 168) then
\r
189 if (y >= 176) and (y <= 184) then
\r
193 if (y >= 192) and (y <= 200) then
\r
197 if (y >= 208) and (y <= 216) then
\r
201 if (y >= 224) and (y <= 232) then
\r
210 (* cadre trace un rectangle autour des operations *)
\r
211 UNIT cadre : iiuwgraph PROCEDURE(xg,yg,xd,yd:integer);
\r
224 (* menu propose les traitements pouvant etre realises sur les arbres bicolores *)
\r
225 UNIT menu : iiuwgraph FUNCTION : integer;
\r
226 VAR i,b,h,v,numop:integer,
\r
227 g,d,c,driver,selection:boolean;
\r
239 call OUTSTRING("OPERATIONS SUR LES ARBRES BICOLORES");
\r
241 call cadre(24,56,544,240);
\r
243 call OUTSTRING("Creation d'un arbre bicolore");
\r
245 call OUTSTRING("Ajout d'un element");
\r
247 call OUTSTRING("Recherche d'un element dans un arbre");
\r
249 call OUTSTRING("Recherche du minimum dans un arbre");
\r
251 call OUTSTRING("Recherche du maximum dans un arbre");
\r
253 call OUTSTRING("Recherche de(s) successeur(s) d'un element de l'arbre");
\r
255 call OUTSTRING("Recherche du predecesseur d'un element de l'arbre");
\r
257 call OUTSTRING("Suppression de certains noeuds de l'arbre");
\r
259 call OUTSTRING("Affichage d'un arbre");
\r
261 call OUTSTRING("Quitter l'application");
\r
263 call OUTSTRING("Selectionnez l'operation avec le bouton gauche de la souris...");
\r
265 (* Gestion de la souris *)
\r
267 call SETPOSITION(0,0);
\r
270 call GETPRESS(0,h,v,b,g,d,c);
\r
272 call MOUSEPOS(h,v,selection,numop);
\r
273 if not selection then
\r
287 (* a creer un bicolore : inserer un element dans un arbre vide *)
\r
288 (* a ajouter un element dans un arbre deja cree *)
\r
290 (* ses parametres sont : *)
\r
291 (* en entree, l'element a inserer *)
\r
292 (* en entree/sortie, la racine de l'arbre et 2 sentinelles *)
\r
293 (* un booleen indiquant si au moins un ajout a ete realise *)
\r
295 UNIT ajout : PROCEDURE(x:integer;inout A,T,Z,Q:bic,adj:boolean);
\r
296 VAR P,GP,AGP : bic,
\r
298 (* Pere,grand-pere et arriere grand-pere du pteur courant A *)
\r
299 (* Ces pointeurs servent au reequilibrage de l'arbre *)
\r
302 pref IIUWGRAPH block
\r
306 A:=T; (* T:Tete de l'arbre ayant pour valeur 0, pour couleur blanc, *)
\r
307 (* pour fils gauche Z et pour fils droit initial Z *)
\r
308 Z.val:=x; (* On affecte l'element a inserer au champ val de Z *)
\r
320 if x < A.val then (* Descente dans l'arbre *)
\r
326 if (A.fg.rouge and A.fd.rouge) then
\r
328 if A = Z then (* Ajout de l'element dand une feuille *)
\r
334 A.rouge:=true; (* L'ajout d'un element s'effectue dans une feuille *)
\r
335 (* qui devient un noeud rouge *)
\r
342 A.rouge:=true; (* Inversion des couleurs *)
\r
349 if P.rouge then (* Reequilibrage car 2 noeuds rouges consecutifs*)
\r
353 call OUTSTRING("RESULTAT INTERMEDIAIRE : ");
\r
355 call affpreordre(Taff,ZZ,0.5,1,0,0);
\r
357 call OUTSTRING("Tapez sur une touche pour continuer ...");
\r
360 (* 8 types de rotation-raccrochage *)
\r
361 if P.val > GP.val then (* Rotation gauche ou droite-gauche *)
\r
362 if A.val > P.val then
\r
367 if GP.val < AGP.val then
\r
373 if A.val < P.val then (* Rotation droite ou gauche-droite *)
\r
378 if GP.val < AGP.val then
\r
384 (* Retablissement des couleurs apres rotation *)
\r
388 (* Retablissement de la hierarchie des ascendants *)
\r
392 A:=P; (* A renvoie l'adresse de l'element a inserer dans l'arbre *)
\r
403 if x <> A.val then (* Poursuite de la descente car place *)
\r
404 (* nouvel element non trouvee *)
\r
407 exit; (* L'ajout de l'element est termine *)
\r
411 T.fd.rouge:=false; (* La racine de l'arbre est toujours blanche *)
\r
415 (* recherche parcourt l'arbre et indique si l'element a rechercher *)
\r
416 (* est present ou absent de l'arbre *)
\r
417 (* ses parametres d'entree sont l'element a rechercher , la sentinelle Z1 *)
\r
418 (* Tr: noeud contenant l'element recherche et Pr:pere de Tr *)
\r
420 UNIT recherche : FUNCTION (x:integer,Z1:bic;inout Tr,Pr:bic):boolean;
\r
422 (* Parcours de l'arbre *)
\r
424 while Tr <> Z1 and not result
\r
426 if x = Tr.val then (* On a trouve l'element :recherche terminee positivement *)
\r
428 else (* On continue la recherche *)
\r
429 if x < Tr.val then (* a gauche *)
\r
433 if x > Tr.val then (* a droite *)
\r
442 (* Suppression supprime un certain type de noeud de l'arbre *)
\r
443 (* Ses parametres d'entree sont l'element a supprimer, la sentinelle Z1 *)
\r
444 (* Tr: noeud contenant l'element a supprimer et Pr:pere de Tr *)
\r
446 UNIT suppression :PROCEDURE(x:integer,Z1:bic;inout T,Tr,Pr:bic,adj:boolean);
\r
448 pref IIUWGRAPH block
\r
450 if Tr.fg = Z1 and Tr.fd = Z1 then (*Si c'est un noeud sans fils *)
\r
451 if Tr = T.fd then (* Si le noeud a supprimer est la racine *)
\r
454 adj:=false; (* L'arbre devient donc vide *)
\r
456 if Tr.val < Pr.val then
\r
463 if Tr.fg <> Z1 and Tr.fd=Z1 then (* Si c'est un noeud qui a un fils gauche *)
\r
464 (* Alors on remplace ce noeud par son fils*)
\r
467 Pr.fd.rouge:=false;
\r
470 if Tr.val < Pr.val then
\r
472 Pr.fg.rouge:=false;
\r
476 Pr.fd.rouge:=false;
\r
480 else (* Si c'est un noeud qui a un fils droit *)
\r
481 (* Alors on remplace ce noeud par son fils*)
\r
482 if Tr.fg = Z1 and Tr.fd <> Z1 then
\r
485 Pr.fd.rouge:=false;
\r
488 if Tr.val < Pr.val then
\r
490 Pr.fg.rouge:=false;
\r
494 Pr.fd.rouge:=false;
\r
498 else (* Si c'est un noeud qui a deux fils *)
\r
499 (* Alors on remplace ce noeud par celui*)
\r
500 (* qui lui est inferieur *)
\r
501 if (Tr.fg.fg=Z1 and Tr.fg.fd=Z1) and (Tr.fd.fg=Z1 and Tr.fd.fd=Z1) then
\r
502 if Tr.val > Pr.val then
\r
507 Pr.fd.rouge:=false;
\r
510 else (*Cas non traite: Le noeud a supprimer a des petits fils *)
\r
511 call MOVE (40,160);
\r
512 call OUTSTRING("Il est impossible de supprimer ce genre de noeuds...");
\r
514 call OUTSTRING("Tapez sur une touche pour verification ...");
\r
524 (* rd effectue une rotation a droite de l'arbre *)
\r
525 UNIT rd : PROCEDURE(inout GP:bic);
\r
535 (* rg effectue une rotation a gauche de l'arbre *)
\r
536 UNIT rg : PROCEDURE(inout GP:bic);
\r
546 (* rdg effectue une rotation droite-gauche de l'arbre *)
\r
547 UNIT rdg : PROCEDURE(inout GP:bic);
\r
553 (* rgd effectue une rotation gauche-droite de l'arbre *)
\r
554 UNIT rgd : PROCEDURE(inout GP:bic);
\r
560 (* minmax renvoie le minimum ou le maximum de l'arbre *)
\r
561 (* ses parametres d'entree sont l'arbre, la sentinelle, et le type de recherche *)
\r
562 UNIT minmax : FUNCTION(N,Z1:bic,choix:integer) : integer;
\r
563 VAR S:bic; (* Noeud contenant la valeur a renvoyer *)
\r
565 (* Si on recherche le minimum (choix=0) on descend le plus a gauche possible *)
\r
566 (* Si on recherche le maximum (choix=1) on descend le plus a droite possible *)
\r
586 (* affpreordre affiche l'arbre dans un ordre prefixe *)
\r
587 UNIT affpreordre : PROCEDURE(N,Z1:bic,coefm,sup,inf:real,niveau:integer);
\r
588 VAR posx:real,posy,i,j:integer;
\r
590 pref iiuwgraph BLOCK
\r
594 posx:=(coefm * (sup - inf)) + inf;
\r
595 posy:= niveau * 35;
\r
596 if niveau <> 1 then
\r
597 call DRAW(posx*640 , posy);
\r
604 call MOVE(round(posx * 640),posy);
\r
606 call WriteInteger(N.val);
\r
607 call MOVE(INXPOS + 4,INYPOS);
\r
609 call MOVE(INXPOS-20,INYPOS);
\r
610 call affpreordre(N.fg,Z1,0.5,posx,inf,niveau);
\r
611 call MOVE(ROUND(posx * 640) + 8 , posy + 8);
\r
612 call affpreordre(N.fd,Z1,0.5,sup,posx,niveau);
\r
613 call MOVE(ROUND(posx * 640) + 8,posy + 8);
\r
618 (* menage:permet la destruction de l'objet passe en parametre *)
\r
619 UNIT menage : PROCEDURE(inout Z,N:bic);
\r
622 call menage(Z,N.fg);
\r
626 call menage(Z,N.fd);
\r
631 (* PROGRAMME PRINCIPAL *)
\r
633 VAR rep,elt,interm:integer, (* rep:choix de l'operation a realiser *)
\r
634 (* elt:Element entre par l'utilisateur *)
\r
635 (* interm:reponse aux questions posees *)
\r
636 AA,ZZ,QQ,TT,Taff,Trech,Prech:bic,
\r
637 (* AA:pointeur sur le noeud courant *)
\r
638 (* ZZ:sentinelle sur laquelle on fait pointer tous *)
\r
639 (* les liens qui sont a NONE *)
\r
640 (* QQ:sentinelle pointee par ZZ et dont les liens *)
\r
642 (* TT:Tete de l'arbre dont le fils droit va pointer*)
\r
643 (* sur le premier noeud de l'arbre *)
\r
648 pref IIUWGRAPH block
\r
658 rep:=menu; (* Recuperation du choix de l'utilisateur *)
\r
662 when 0: (* Pour quitter l'application *)
\r
664 call menage(ZZ,TT); (*Destruction de l'arbre*)
\r
671 call Setcursor(5,20);
\r
672 writeln("**********TERMINE**********");
\r
673 call ENDRUN; (*Sortie de l'application*)
\r
675 when 1: call CLS; (* pour creer un arbre *)
\r
679 call OUTSTRING("ATTENTION ! : L'arbre precedemment cree va etre efface");
\r
682 call OUTSTRING("Voulez-vous toujours creer un arbre ? Si oui, tapez 1 : ");
\r
683 interm:=ReadInteger;
\r
684 if interm <> 1 then
\r
687 call menage(ZZ,TT); (*Destruction de l'arbre*)
\r
693 (* creation et initialisation du pointeur courant et des 2 sentinnelles *)
\r
711 (* creation et initialisation de la tete de l'arbre *)
\r
726 call OUTSTRING("CREATION D'UN ARBRE BICOLORE");
\r
728 call OUTSTRING("Entrez le premier element de l'arbre :");
\r
732 (* On va inserer elt dans l'arbre *)
\r
733 call ajout(elt,AA,TT,ZZ,QQ,adjonc);
\r
736 when 2 : call CLS; (* pour ajouter un element dans l'arbre *)
\r
740 call OUTSTRING("AJOUT D'UN ELEMENT DANS UN ARBRE BICOLORE");
\r
742 call OUTSTRING("Entrez l'element a inserer dans l'arbre :");
\r
746 (* Test de presence de l'element dans l'arbre *)
\r
748 if recherche(elt,ZZ,Trech,Prech) then
\r
750 call MOVE(160,120);
\r
751 call OUTSTRING("ATTENTION ! AJOUT IMPOSSIBLE !!!");
\r
753 call WriteInteger(elt);
\r
754 call OUTSTRING(" est deja present dans l'arbre ! ");
\r
756 call OUTSTRING("Tapez sur une touche pour verification...");
\r
761 call OUTSTRING("VERIFICATION");
\r
763 (* Affichage de l'arbre *)
\r
765 call affpreordre(Taff,ZZ,0.5,1,0,0);
\r
767 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
770 call ajout(elt,AA,TT,ZZ,QQ,adjonc);
\r
774 call OUTSTRING("RESULTAT : ");
\r
776 call affpreordre(Taff,ZZ,0.5,1,0,0);
\r
778 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
784 call OUTSTRING("ATTENTION !");
\r
786 call OUTSTRING("Ajout impossible car arbre inexistant !");
\r
788 call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : ");
\r
790 interm:=ReadInteger;
\r
795 call menage(ZZ,TT); (*Destruction de l'arbre*)
\r
800 call MOVE(160,160);
\r
801 call OUTSTRING("**********TERMINE**********");
\r
807 when 3 : call CLS; (* pour chercher un element dans l'arbre *)
\r
811 call OUTSTRING("RECHERCHE D'UN ELEMENT DANS UN ARBRE BICOLORE");
\r
813 call OUTSTRING("Entrez l'element a rechercher dans l'arbre :");
\r
817 if not recherche(elt,ZZ,Trech,Prech) then
\r
820 call WriteInteger(elt);
\r
821 call OUTSTRING(" est absent de l'arbre !!");
\r
823 call OUTSTRING("Tapez sur une touche pour verification...");
\r
828 call OUTSTRING("VERIFICATION");
\r
830 call affpreordre(Taff,ZZ,0.5,1,0,0);
\r
832 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
836 call WriteInteger(elt);
\r
837 call OUTSTRING(" est present dans l'arbre");
\r
839 call OUTSTRING("Tapez sur une touche pour verification...");
\r
844 call OUTSTRING("VERIFICATION : ");
\r
846 call affpreordre(Taff,ZZ,0.5,1,0,0);
\r
848 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
853 call MOVE(160,120);
\r
854 call OUTSTRING("ATTENTION !");
\r
856 call OUTSTRING("Recherche impossible car arbre inexistant !");
\r
858 call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : ");
\r
859 call MOVE(496,152);
\r
860 interm:=ReadInteger;
\r
865 call menage(ZZ,TT); (*Destruction de l'arbre*)
\r
870 call MOVE(160,160);
\r
871 call OUTSTRING("**********TERMINE**********");
\r
877 when 4 : call CLS; (* pour trouver le minimum de l'arbre *)
\r
880 call OUTSTRING("RECHERCHE DU MINIMUM DANS UN ARBRE BICOLORE");
\r
882 call OUTSTRING("Voici le minimum de l'arbre bicolore :");
\r
883 call MOVE(360,136);
\r
884 call WriteInteger(minmax(TT,ZZ,0));
\r
886 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
890 call MOVE(160,120);
\r
891 call OUTSTRING("ATTENTION !");
\r
893 call OUTSTRING("Recherche du minimum impossible car arbre inexistant !");
\r
895 call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : ");
\r
896 call MOVE(488,160);
\r
897 interm:=ReadInteger;
\r
902 call menage(ZZ,TT); (*Destruction de l'arbre*)
\r
907 call MOVE(160,160);
\r
908 call OUTSTRING("**********TERMINE**********");
\r
914 when 5 : call CLS; (* pour trouver le maximum de l'arbre *)
\r
917 call OUTSTRING("RECHERCHE DU MAXIMUM DANS UN ARBRE BICOLORE");
\r
919 call OUTSTRING("Voici le maximum de l'arbre bicolore :");
\r
920 call MOVE(360,136);
\r
921 call WriteInteger(minmax(TT,ZZ,1));
\r
923 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
928 call OUTSTRING("ATTENTION !");
\r
930 call OUTSTRING("Recherche du maximum impossible car arbre inexistant !");
\r
932 call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : ");
\r
934 interm:=ReadInteger;
\r
939 call menage(ZZ,TT); (*Destruction de l'arbre*)
\r
944 call MOVE(160,160);
\r
945 call OUTSTRING("**********TERMINE**********");
\r
951 when 6 : call CLS; (* pour chercher le(s) successeur(s) d'un element*)
\r
955 call OUTSTRING("RECHERCHE DE(S) SUCCESSEUR(S) D'UN ELEMENT");
\r
957 call OUTSTRING("Entrez l'element dont vous voulez le(s) successeur(s) :");
\r
961 if not recherche(elt,ZZ,Trech,Prech) then
\r
964 call WriteInteger(elt);
\r
965 call OUTSTRING(" est absent de l'arbre !!");
\r
967 call OUTSTRING("Tapez sur une touche pour verification...");
\r
972 call OUTSTRING("VERIFICATION : ");
\r
974 call affpreordre(Taff,ZZ,0.5,1,0,0);
\r
976 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
981 if Trech.fg <> ZZ and Trech.fd <> ZZ then
\r
982 call OUTSTRING("Le(s) successeurs de ");
\r
983 call WriteInteger(elt);
\r
984 call OUTSTRING(" sont : ");
\r
985 call WriteInteger(Trech.fg.val);
\r
986 call OUTSTRING(" et ");
\r
987 call WriteInteger(Trech.fd.val);
\r
989 if Trech.fg <> ZZ then
\r
990 call OUTSTRING("Le successeur gauche de ");
\r
991 call WriteInteger(elt);
\r
992 call OUTSTRING(" est : ");
\r
993 call WriteInteger(Trech.fg.val);
\r
995 if Trech.fd <> ZZ then
\r
996 call OUTSTRING("Le successeur droit de ");
\r
997 call WriteInteger(elt);
\r
998 call OUTSTRING("est : ");
\r
999 call WriteInteger(Trech.fd.val);
\r
1001 call OUTSTRING("L'element ");
\r
1002 call WriteInteger(elt);
\r
1003 call OUTSTRING(" n'a aucun successeur !");
\r
1008 call MOVE(40,152);
\r
1009 call OUTSTRING("Tapez sur une touche pour verification...");
\r
1013 call MOVE(112,16);
\r
1014 call OUTSTRING("VERIFICATION : ");
\r
1016 call affpreordre(Taff,ZZ,0.5,1,0,0);
\r
1017 call MOVE(40,300);
\r
1018 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
1024 call MOVE(350,40);
\r
1025 call OUTSTRING("ATTENTION !");
\r
1026 call MOVE(40,64);
\r
1027 call OUTSTRING("Recherche impossible car arbre inexistant !");
\r
1029 call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : ");
\r
1030 call MOVE(488,80);
\r
1031 interm:=ReadInteger;
\r
1036 call menage(ZZ,TT); (*Destruction de l'arbre*)
\r
1041 call MOVE(160,160);
\r
1042 call OUTSTRING("**********TERMINE**********");
\r
1049 when 7 : call CLS; (* pour chercher le predecesseur d'un element*)
\r
1052 call MOVE(136,16);
\r
1053 call OUTSTRING("RECHERCHE DU PREDECESSEUR D'UN ELEMENT");
\r
1055 call OUTSTRING("Entrez l'element dont vous voulez le predecesseur :");
\r
1056 call MOVE(456,88);
\r
1059 if not recherche(elt,ZZ,Trech,Prech) then
\r
1061 call MOVE(40,136);
\r
1062 call WriteInteger(elt);
\r
1063 call OUTSTRING(" est absent de l'arbre !!");
\r
1064 call MOVE(40,152);
\r
1065 call OUTSTRING("Tapez sur une touche pour verification...");
\r
1070 call OUTSTRING("VERIFICATION : ");
\r
1072 call affpreordre(Taff,ZZ,0.5,1,0,0);
\r
1073 call MOVE(40,300);
\r
1074 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
1080 if Trech = TT.fd then
\r
1081 call OUTSTRING("L'element ");
\r
1082 call WriteInteger(elt);
\r
1083 call OUTSTRING(" n'a pas de predecesseur ! ");
\r
1085 call OUTSTRING("Le predecesseur de ");
\r
1086 call WriteInteger(elt);
\r
1087 call OUTSTRING(" est : ");
\r
1088 call WriteInteger(Prech.val);
\r
1092 call MOVE(40,152);
\r
1093 call OUTSTRING("Tapez sur une touche pour verification...");
\r
1097 call OUTSTRING("VERIFICATION : ");
\r
1099 call affpreordre(Taff,ZZ,0.5,1,0,0);
\r
1100 call MOVE(40,300);
\r
1101 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
1107 call MOVE(350,40);
\r
1108 call OUTSTRING("ATTENTION !");
\r
1110 call OUTSTRING("Recherche impossible car arbre inexistant !");
\r
1112 call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : ");
\r
1113 call MOVE(488,80);
\r
1114 interm:=ReadInteger;
\r
1119 call menage(ZZ,TT); (*Destruction de l'arbre*)
\r
1124 call MOVE(160,160);
\r
1125 call OUTSTRING("**********TERMINE**********");
\r
1131 when 8 : call CLS; (* pour supprimer un element*)
\r
1133 call MOVE(152,16);
\r
1134 call OUTSTRING("SUPPRESSION D'UN ELEMENT");
\r
1136 call OUTSTRING("Entrez l'element a supprimer :");
\r
1137 call MOVE(280,88);
\r
1141 if not recherche(elt,ZZ,Trech,Prech) then
\r
1143 call MOVE(40,136);
\r
1144 call WriteInteger(elt);
\r
1145 call OUTSTRING(" est absent de l'arbre donc suppression impossible !!");
\r
1146 call MOVE(40,152);
\r
1147 call OUTSTRING("Tapez sur une touche pour verification...");
\r
1150 call suppression(elt,ZZ,TT,Trech,Prech,adjonc);
\r
1151 if not adjonc then
\r
1155 call MOVE(350,40);
\r
1156 call OUTSTRING("Arbre detruit !!!");
\r
1157 call MOVE(40,200);
\r
1158 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
1166 call OUTSTRING("VERIFICATION ");
\r
1168 call affpreordre(Taff,ZZ,0.5,1,0,0);
\r
1169 call MOVE(40,300);
\r
1170 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
1174 call MOVE(350,40);
\r
1175 call OUTSTRING("ATTENTION !");
\r
1177 call OUTSTRING("Suppression impossible car arbre inexistant !");
\r
1179 call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : ");
\r
1180 call MOVE(488,80);
\r
1181 interm:=ReadInteger;
\r
1186 call menage(ZZ,TT); (*Destruction de l'arbre*)
\r
1191 call MOVE(160,160);
\r
1192 call OUTSTRING("**********TERMINE**********");
\r
1198 when 9 : call CLS; (* pour afficher le contenu de l'arbre *)
\r
1201 call MOVE(192,16);
\r
1203 call OUTSTRING("AFFICHAGE DE L'ARBRE BICOLORE");
\r
1204 call MOVE(180,32);
\r
1206 call affpreordre(Taff,ZZ,0.5,1,0,0);
\r
1208 call OUTSTRING("ARBRE VIDE !!!!");
\r
1210 call MOVE(40,300);
\r
1211 (*call COLOR(7);*)
\r
1212 call OUTSTRING("Tapez sur une touche pour retourner au menu ...");
\r
1217 call CLS; (* gestion des operations inexistantes *)
\r
1218 call MOVE(350,40);
\r
1219 call OUTSTRING("Option inexistante !!");
\r
1220 call MOVE(40,152);
\r
1221 call OUTSTRING("Voulez-vous retourner au menu ? Si oui, tapez 1 : ");
\r
1222 call MOVE(440,152);
\r
1223 interm:=ReadInteger;
\r
1228 call menage(ZZ,TT); (*Destruction de l'arbre*)
\r
1233 call MOVE(160,1600);
\r
1234 call OUTSTRING("**********TERMINE**********");
\r