INFO607
arbre.c
Go to the documentation of this file.
1#include <stdlib.h>
2#include "arbre.h"
3
4
5/**
6 * Copie une donnée dans une autre. Cette fonction est utile lorsque
7 * le type ValType est complexe et que l'opérateur d'affectation du C
8 * ne fonctionne pas bien.
9 *
10 * @param d1 un pointeur vers la première donnée à recopier.
11 *
12 * @param d2 un pointeur vers la deuxième donnée, qui sera écrasée et
13 * prendra les valeurs de d1.
14 */
15void CopierDonnees( Donnee* d1, Donnee* d2 )
16{
17 *d2 = *d1;
18}
19
20
21/**
22 * @return l'arbre vide.
23 */
25{
26 return NULL;
27}
28
29/**
30 * Détruit un arbre et désalloue tous ses éléments alloués.
31 *
32 * @param A un pointeur vers un arbre valide.
33 */
34void Detruire( Arbre* A )
35{
36 if ( A != ArbreVide() )
37 {
38 Detruire( A->gauche );
39 Detruire( A->droit );
40 free( A );
41 }
42}
43
44/**
45 * Crée et retourne un arbre avec un seul noeud qui recopie la donnée
46 * pointée par ptr_d.
47 *
48 * @param ptr_d un pointeur vers une donnée.
49 *
50 * @return un pointeur vers l'arbre créé (ie. un pointeur vers sa
51 * racine).
52 */
53extern Arbre* Creer0( Donnee* ptr_d )
54{
55 return Creer2( ptr_d, ArbreVide(), ArbreVide() );
56}
57
58
59/**
60 * Crée et retourne un arbre qui l'union de deux sous-arbres plus un
61 * noeud qui recopie la donnée pointée par ptr_d.
62 *
63 * @param ptr_d un pointeur vers une donnée.
64 *
65 * @param G un pointeur vers le futur sous-arbre gauche. Attention il
66 * ne faut plus s'en servir après, car il est intégré à l'arbre A.
67 *
68 * @param D un pointeur vers le futur sous-arbre droit. Attention il
69 * ne faut plus s'en servir après, car il est intégré à l'arbre A.
70 *
71 * @return un pointeur vers l'arbre créé (ie. un pointeur vers sa
72 * racine).
73 */
74Arbre* Creer2( Donnee* ptr_d, Arbre* G, Arbre* D )
75{
76 Noeud* racine = (Noeud*) malloc( sizeof(Noeud) );
77 CopierDonnees( ptr_d, &racine->data );
78 racine->gauche = G;
79 racine->droit = D;
80 return racine;
81}
82
83
84/**
85 * Retourne le noeud racine de A (éventuellement NULL si arbre vide).
86 *
87 * NB: Vu les définitions, retourne A directement, car l'arbre est
88 * confondu avec son noeud racine.
89 *
90 * @param A un pointeur vers un arbre valide.
91 */
92extern Noeud* Racine( Arbre* A )
93{
94 return A;
95}
96
97
98/**
99 * @return le noeud fils gauche de N (éventuellement NULL si N n'avait
100 * pas de fils gauche).
101 *
102 * @param N un pointeur vers un noeud valide.
103 */
105{
106 return N->gauche;
107}
108
109/**
110 * Modifie le noeud N de façon à ce que SG devienne sous nouveau
111 * sous-arbre gauche. L'ancien sous-arbre gauche de N est désalloué.
112 *
113 * @param N un pointeur vers un noeud valide.
114 * @param SG le nouveau sous-arbre, éventuellement vide ou réduit à un noeud.
115 */
116void ModifieGauche( Noeud* N, Arbre* SG )
117{
118 Detruire( N->gauche );
119 N->gauche = SG;
120}
121
122/**
123 * @return le noeud fils droit de N (éventuellement NULL si N n'avait
124 * pas de fils droit).
125 *
126 * @param N un pointeur vers un noeud valide.
127 */
129{
130 return N->droit;
131}
132
133/**
134 * Modifie le noeud N de façon à ce que SD devienne sous nouveau
135 * sous-arbre droit. L'ancien sous-arbre droit de N est désalloué.
136 *
137 * @param N un pointeur vers un noeud valide.
138 * @param SD le nouveau sous-arbre, éventuellement vide ou réduit à un noeud.
139 */
140void ModifieDroit( Noeud* N, Arbre* SD )
141{
142 Detruire( N->droit );
143 N->droit = SD;
144}
145
146/**
147 * Permet la lecture et l'écriture dans la donnée associée au noeud N.
148 *
149 * @return un pointeur vers la donnee du noeud N.
150 *
151 * @param N un pointeur vers un noeud valide.
152 */
154{
155 return & N->data;
156}
Arbre * ArbreVide()
Definition arbre.c:24
void Detruire(Arbre *A)
Definition arbre.c:34
Noeud * Racine(Arbre *A)
Definition arbre.c:92
void ModifieDroit(Noeud *N, Arbre *SD)
Definition arbre.c:140
Arbre * Creer2(Donnee *ptr_d, Arbre *G, Arbre *D)
Definition arbre.c:74
Noeud * Gauche(Noeud *N)
Definition arbre.c:104
Noeud * Droit(Noeud *N)
Definition arbre.c:128
void ModifieGauche(Noeud *N, Arbre *SG)
Definition arbre.c:116
Arbre * Creer0(Donnee *ptr_d)
Definition arbre.c:53
void CopierDonnees(Donnee *d1, Donnee *d2)
Definition arbre.c:15
Donnee * Valeur(Noeud *N)
Definition arbre.c:153
int Donnee
Definition arbre.h:5
Definition arbre.h:30
struct SNoeud * gauche
Definition arbre.h:32
Donnee data
Definition arbre.h:31
struct SNoeud * droit
Definition arbre.h:33