1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
#include<stdio.h>
#include <stdlib.h>
#include <conio.h>
/*type liste*/
struct noeud {
int val;
struct noeud *g;
struct noeud *d;
};
typedef struct noeud *ab;
/*creation dun neoud*/
ab creat(int v, ab ls, ab rs)
{
ab res;
// malloc renvoie un pointeur sur un espace mémoire
// dont la taille est fournie en paramètre.
// Tu veux créer de la place pour un noeud et malloc
// renvoie un pointeur sur cet espace.
// C'est à priori le seul endroit où tu vas utiliser
// struct noeud
res = (ab) malloc(sizeof(struct noeud));
if (res == NULL) {
fprintf(stderr, "Impossible d'allouer le noeud");
return NULL;
}
res->val = v;
res->g = ls;
res->d = rs;
return res;
}
/*ajout dun element dans un ab*/
// Avec cette version toutes les modifications
// que tu vas faire sur r seront perdues au
// retour de la fonction
// si tu as :
// r=NULL;
// ajout_old(r, 1);
// ici r sera toujours NULL
// pour modifier la valeur de r il faut réecrire
// la fonction avec pour paramètre un pointeur
// sur r, donc de type ab*
// Comme tu fais pour scanf par exemple
void ajout_old(ab r, int elt)
{
if (r == NULL) {
r = creat(elt, NULL, NULL);
} else if (r->g == NULL) {
r->g = creat(elt, NULL, NULL);
} else if (r->d == NULL) {
r->d = creat(elt, NULL, NULL);
} else {
ajout_old(r->g, elt);
}
}
// ici pr est un pointeur sur un ab
// si le pointeur est NULL il doit y avoir une
// erreur
// si le pointeur pointe sur NULL = arbre vide
// j'ai sur parenthésé pour que tu vois
// ce qui est manipulé
void ajout(ab* pr, int elt)
{
if (pr==NULL) {
printf("Erreur.");
exit(1);
} else if ((*pr)==NULL)
*pr=creat(elt,NULL,NULL);
else if ((*pr)->g==NULL)
(*pr)->g=creat(elt,NULL,NULL);
else if ((*pr)->d==NULL)
(*pr)->d=creat(elt,NULL,NULL);
else
// remarque que je passe l'adresse du
// fils gauche
ajout( &((*pr)->g), elt);
}
/*tester legalite de dexu ab*/
bool egal(ab r1, ab r2)
{
if((r1==NULL)&&(r2==NULL)) {return true;}
else if (r1->val==r2->val) {return true;}
else if ((r1==NULL)||(r2==NULL)) {return false;}
else {return (egal(r1->g,r2->g)&&egal(r1->d,r2->d));}
}
/*programme principal*/
main()
{
int choix,cho,cho1,cho2,x,x1,x2;
ab r1=NULL,r2=NULL,a = NULL;
do {
/*faire le choix */
printf("\n");
printf("taper (8)- pour Tester l'egalite de deux arbres binaires.");
printf("\n");
printf("\n");
printf("ENTRER VOTRE CHOIX : ");
scanf("%d", &choix);
printf("\n");
/*travailler le choix */
switch (choix) {
case 8:{
printf("**TESTER L'EGALITE DE DEUX ARBRES BINAIRES**\n");
printf("\n");
printf("<<Creation de R1>>\n");
cho1 = 1;
while (cho1 != 0) {
printf
("Entrer la valeur pour l'inserer dans l'arbre R1:\n");
scanf("%d",&x1);
ajout(&r1,x1);
printf
("Voulez vous ajoutez un element? (1 / 0)\n");
scanf("%d",&cho1);
}
printf("<<Creation de R2>>\n");
cho2 = 1;
printf("\n");
while (cho2 != 0) {
printf
("Entrer la valeur pour l'inserer dans l'arbre R2:\n");
scanf("%d", &x2);
ajout(&r2, x2);
printf
("Voulez vous ajoutez un element? (1 / 0)\n");
scanf("%d", &cho2);
}
printf("R1 et R2 sont egaux: ");
if (egal(r1,r2)==true){printf("V");}
else{printf("F");}
break;
}
}
} while (choix != 0);
// getch();
} |
Partager