INFO607
TP-Proximity
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
*/
15
void
CopierDonnees
(
Donnee
* d1,
Donnee
* d2 )
16
{
17
*d2 = *d1;
18
}
19
20
21
/**
22
* @return l'arbre vide.
23
*/
24
Arbre
*
ArbreVide
()
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
*/
34
void
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
*/
53
extern
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
*/
74
Arbre
*
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
*/
92
extern
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
*/
104
Noeud
*
Gauche
(
Noeud
* N )
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
*/
116
void
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
*/
128
Noeud
*
Droit
(
Noeud
* N )
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
*/
140
void
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
*/
153
Donnee
*
Valeur
(
Noeud
* N )
154
{
155
return
& N->
data
;
156
}
ArbreVide
Arbre * ArbreVide()
Definition
arbre.c:24
Detruire
void Detruire(Arbre *A)
Definition
arbre.c:34
Racine
Noeud * Racine(Arbre *A)
Definition
arbre.c:92
ModifieDroit
void ModifieDroit(Noeud *N, Arbre *SD)
Definition
arbre.c:140
Creer2
Arbre * Creer2(Donnee *ptr_d, Arbre *G, Arbre *D)
Definition
arbre.c:74
Gauche
Noeud * Gauche(Noeud *N)
Definition
arbre.c:104
Droit
Noeud * Droit(Noeud *N)
Definition
arbre.c:128
ModifieGauche
void ModifieGauche(Noeud *N, Arbre *SG)
Definition
arbre.c:116
Creer0
Arbre * Creer0(Donnee *ptr_d)
Definition
arbre.c:53
CopierDonnees
void CopierDonnees(Donnee *d1, Donnee *d2)
Definition
arbre.c:15
Valeur
Donnee * Valeur(Noeud *N)
Definition
arbre.c:153
arbre.h
Donnee
int Donnee
Definition
arbre.h:5
SNoeud
Definition
arbre.h:30
SNoeud::gauche
struct SNoeud * gauche
Definition
arbre.h:32
SNoeud::data
Donnee data
Definition
arbre.h:31
SNoeud::droit
struct SNoeud * droit
Definition
arbre.h:33
Generated by
1.9.8