]>
Piment Noir Git Repositories - Algorithmic_C.git/blob - TP6/arbres/ABR/ABR.c
1 /*****************************************************************************/
2 /* ABR : arbres binaires de recherche */
3 /*****************************************************************************/
10 typedef struct noeud
{
17 /* Creation d'un ABR vide */
24 /* Insertion/Ajout d'un nouvel element dans l'ABR */
25 NOEUD
* insere ( NOEUD
* p
, element x
)
28 p
= ( NOEUD
*) malloc ( sizeof ( NOEUD
));
32 } else if ( x
== p
-> valeur
)
33 printf ( " %d est deja dans l'arbre \n " , x
);
34 else if ( x
< p
-> valeur
)
35 p
-> gauche
= insere ( p
-> gauche
, x
);
37 p
-> droit
= insere ( p
-> droit
, x
);
42 /* Recherche d'un element dans l'ABR */
43 int recherche ( NOEUD
* p
, element x
)
50 return recherche ( p
-> gauche
, x
);
52 return recherche ( p
-> droit
, x
);
56 /* Affichage du contenu de l'ABR en ordre croissant (par parcours profondeur infixe) */
57 void affiche ( NOEUD
* p
)
61 printf ( " %d " , p
-> valeur
);
67 /* Affichage de l'arbre (sous forme arborescente) */
68 void affiche_arbre ( NOEUD
* p
, int col
)
73 affiche_arbre ( p
-> droit
, col
+ 1 );
74 for ( i
= 0 ; i
< col
; i
++)
76 printf ( " %d \n " , p
-> valeur
);
77 affiche_arbre ( p
-> gauche
, col
+ 1 );
82 /* Copie d'arbre (on cree physiquement le double de l'arbre de racine p) */
83 NOEUD
* copie_arbre ( NOEUD
* p
)
90 q
= ( NOEUD
*) malloc ( sizeof ( NOEUD
));
91 q
-> valeur
= p
-> valeur
;
92 q
-> gauche
= copie_arbre ( p
-> gauche
);
93 q
-> droit
= copie_arbre ( p
-> droit
);
99 /* Destruction de l'arbre de racine p en recuperant la place occupee (free) par chacun des noeuds */
100 NOEUD
* detruis_arbre ( NOEUD
* p
)
105 p
-> gauche
= detruis_arbre ( p
-> gauche
);
106 p
-> droit
= detruis_arbre ( p
-> droit
);
114 /* Maximum d'un sous-arbre de racine p (i.e., le noeud le plus a droite) */
115 NOEUD
* max ( NOEUD
* p
, NOEUD
* r
)
119 if ( r
-> droit
== NULL
) {
120 p
-> valeur
= r
-> valeur
;
121 q
= r
; /* q : l'element a supprimer par free */
125 r
-> droit
= max ( p
, r
-> droit
);
130 /* Suppression du noeud de valeur x dans l'arbre de racine p.
131 Suppression d'un noeud interne : la valeur du noeud a supprimer est
132 remplacee par celle du noeud le plus a droite de son sous-arbre gauche */
133 NOEUD
* supprime ( NOEUD
* p
, element x
)
138 printf ( " %d n'est pas dans l'arbre \n " , x
);
139 else if ( x
== p
-> valeur
) { /* suppression de p */
140 if ( p
-> droit
== NULL
) {
144 } else if ( p
-> gauche
== NULL
) {
149 p
-> gauche
= max ( p
, p
-> gauche
);
150 } else if ( x
< p
-> valeur
)
151 p
-> gauche
= supprime ( p
-> gauche
, x
);
153 p
-> droit
= supprime ( p
-> droit
, x
);
158 /* Chargement d'un arbre depuis un fichier */
159 NOEUD
* charge ( NOEUD
* p
, FILE * fich
)
162 p
= ( NOEUD
*) malloc ( sizeof ( NOEUD
));
163 fread ( p
, sizeof ( NOEUD
), 1 , fich
);
164 p
-> gauche
= charge ( p
-> gauche
, fich
);
165 p
-> droit
= charge ( p
-> droit
, fich
);
171 /* Sauvegarde d'un arbre dans un fichier */
172 NOEUD
* sauve ( NOEUD
* p
, FILE * fich
)
175 fwrite ( p
, sizeof ( NOEUD
), 1 , fich
);
176 p
-> gauche
= sauve ( p
-> gauche
, fich
);
177 p
-> droit
= sauve ( p
-> droit
, fich
);
185 /*****************************************************************************/
188 NOEUD
* abr
; /* on peut travailler sur 3 arbres */
197 ( "Commandes (une lettre) possibles : v arbre_vide ; r rechercher ; i inserer ; c copier ; d detruire ; a afficher contenu ; A affiche arborescence ; s supprimer ; C charger ; S sauvegarder) \n " );
200 printf ( "Commande ? " );
208 printf ( "indiquer l'element a rechercher : " );
210 if ( recherche ( abr
, x
) == 0 )
211 printf ( "pas trouve \n " );
217 printf ( "indiquer l'element a inserer : " );
219 abr
= insere ( abr
, x
);
223 abr2
= copie_arbre ( abr
);
227 abr
= detruis_arbre ( abr
);
229 abr2
= detruis_arbre ( abr2
);
235 printf ( " \n La copie : \n " );
241 affiche_arbre ( abr
, 1 );
243 printf ( " \n La copie : \n " );
244 affiche_arbre ( abr2
, 1 );
249 printf ( "indiquer l'element a supprimer : " );
251 abr
= supprime ( abr
, x
);
255 printf ( "indiquer le nom de fichier pour le chargement : " );
256 scanf ( " %s " , nom_fich
);
257 if (( fich
= fopen ( nom_fich
, "rb" )) != NULL
) {
258 abr
= ( NOEUD
*) malloc ( sizeof ( NOEUD
));
259 abr
= charge ( abr
, fich
);
265 printf ( "indiquer le nom de fichier pour la sauvegarde : " );
266 scanf ( " %s " , nom_fich
);
267 if (( fich
= fopen ( nom_fich
, "wb" )) != NULL
) {
268 abr
= sauve ( abr
, fich
);
284 /* Trace d'execution **************************************
285 Commandes (une lettre) possibles : v arbre_vide ; r rechercher ; i inserer ; c copier ; d detruire ; a afficher contenu ; A affiche arborescence ; s supprimer ; C charger ; S sauvegarder)
289 indiquer l'element a inserer : 2
292 indiquer l'element a inserer : 6
295 indiquer l'element a inserer : 4
298 indiquer l'element a inserer : 5
301 indiquer l'element a inserer : 1
304 indiquer l'element a inserer : 0
317 indiquer l'element a rechercher : 4
321 indiquer l'element a rechercher : 3
325 indiquer l'element a supprimer : 4
337 indiquer le nom de fichier pour la sauvegarde : sauv.txt
340 indiquer le nom de fichier pour le chargement : sauv.txt
353 ******************************************************************************/