32 void (*supprimer_cle)(intptr_t cle);
33 intptr_t (*copier_cle)(
const intptr_t cle);
34 int (*comparer_cle)(
const intptr_t cle1,
const intptr_t cle2);
40 int (*comparer_cle)(
const intptr_t cle1,
const intptr_t cle2 );
41 intptr_t (*copier_cle)(
const intptr_t cle );
42 void (*supprimer_cle)(intptr_t cle);
49 return (
const intptr_t) asso->cle;
58 const Table* table,
const intptr_t cle, intptr_t valeur
63 if( table->copier_cle && cle ){
64 res->cle = table->copier_cle( cle );
69 res->supprimer_cle = table->supprimer_cle;
70 res->copier_cle = table->copier_cle;
71 res->comparer_cle = table->comparer_cle;
80 if( asso->copier_cle && asso->cle ){
81 res->cle = asso->copier_cle( asso->cle );
86 int compare_table_association(
const void * pa1,
const void * pb1,
void* param ){
89 if( pa->comparer_cle ){
90 int r = pa->comparer_cle( pa->cle, pb->cle );
93 if( pa->cle < pb->cle )
95 if( pa->cle > pb->cle )
102 void supprimer_table_association2(
void* asso_tmp,
void* data ){
104 if( asso->supprimer_cle && asso->cle ){
105 asso->supprimer_cle( asso->cle );
111 if( asso->supprimer_cle && asso->cle ){
112 asso->supprimer_cle( asso->cle );
118 int (*comparer_cle)(
const intptr_t cle1,
const intptr_t cle2 ),
119 intptr_t (*copier_cle)(
const intptr_t cle ),
120 void (*supprimer_cle)(intptr_t cle)
123 res->root = avl_create ( compare_table_association, NULL, NULL );
125 res->supprimer_cle = supprimer_cle;
126 res->comparer_cle = comparer_cle;
127 res->copier_cle = copier_cle;
133 avl_destroy ( table->root, supprimer_table_association2 );
139 void* val = avl_probe ( table->root, (
void*) asso );
141 ERREUR(
"Espace insuffisant" );
144 if( asso_tree != asso ){
145 supprimer_table_association( asso );
146 asso_tree->valeur = valeur;
151 intptr_t valeur = (intptr_t) NULL;
154 table, cle, (intptr_t) NULL
156 void* val = avl_find( table->root, (
void*) asso );
159 valeur = asso_tree->valeur;
161 avl_delete( table->root, (
void*) asso );
163 supprimer_table_association( asso_tree );
165 supprimer_table_association( asso );
171 void (* action)(
const intptr_t cle, intptr_t valeur,
void* data ),
176 avl_t_init( &traverser, table->root );
177 while( (item = avl_t_next( &traverser )) ){
179 action( asso->cle, asso->valeur, data );
184 void (* supprimer_valeur)(intptr_t valeur );
187 void action_pour_toute_valeur_table(
const intptr_t cle, intptr_t valeur,
void* data ){
189 d->supprimer_valeur( valeur );
194 void (* supprimer_valeur)(intptr_t valeur )
197 data.supprimer_valeur = supprimer_valeur;
202 avl_destroy ( table->root, supprimer_table_association2 );
203 table->root = avl_create ( compare_table_association, NULL, NULL );
207 void (*print_cle)(
const intptr_t cle );
208 void (*print_valeur)(
const intptr_t valeur );
211 void print_association(
const intptr_t cle, intptr_t valeur,
void* data ){
219 if( d->print_valeur ){
220 d->print_valeur( valeur );
222 printf(
"%ld", valeur );
228 Table* table,
void (*print_cle)(
const intptr_t cle ),
229 void (*print_valeur)(
const intptr_t valeur ),
230 const char* texte_de_fin
233 data.print_cle = print_cle;
234 data.print_valeur = print_valeur;
238 printf(
" }%s", texte_de_fin );
244 table, cle, (intptr_t) NULL
246 avl_t_find( &it, table->root, (
void*) asso );
247 supprimer_table_association( asso );
253 avl_t_first( &it, table->root );
261 avl_t_last( &it, table->root );
266 return avl_t_is_null( &iterator );
270 avl_t_next( &iterateur );
275 avl_t_prev( &iterateur );
void vider_table(Table *table)
Supprime toutes les clés de la table.
Table_iterateur premier_iterateur_table(const Table *table)
Renvoie un itérateur positionné sur la première association de la table.
intptr_t get_cle(Table_iterateur it)
Renvoie la clé de l'association pointée par l'itérateur passé en paramètre.
int taille_table(Table *t)
Renvoie la taille de la table.
void pour_toute_cle_valeur_table(const Table *table, void(*action)(const intptr_t cle, intptr_t valeur, void *data), void *data)
La fonction passe en revue toutes les associaitons (clé, valeur) de la table, et apelle la fonction p...
void liberer_table(Table *table)
Cette fonction détruit une table. La mémoire qui a été allouée par la table pour stocker les clés son...
intptr_t delete_table(Table *table, const intptr_t cle)
Supprime une clé de la table. La mémoire de la clé est libérée et la valeur associée à la clé est per...
Table_iterateur iterateur_suivant_table(Table_iterateur iterator)
Renvoie l'itérateur suivant.
intptr_t get_valeur(Table_iterateur it)
Renvoie la valeur de l'association pointée par l'itérateur passé en paramètre.
void pour_toute_valeur_table(const Table *table, void(*action)(intptr_t valeur))
La fonction passe en revue toutes les valeurs de la table passée en paramètre et apelle la fonction p...
void print_table(Table *table, void(*print_cle)(const intptr_t cle), void(*print_valeur)(const intptr_t valeur), const char *text_de_fin)
Affiche la table. Vous devez donner en paramètres de print_table, des fonctions pour afficher les clé...
Table_iterateur iterateur_precedent_table(Table_iterateur iterator)
Renvoie l'itérateur précédent.
int iterateur_est_vide(Table_iterateur iterator)
Renvoie 1 si l'itérateur passé en paramètre est vide. Renvoie 0 sinon.
Table_iterateur trouver_table(const Table *table, const intptr_t cle)
Renvoie un itérateur positionné sur l'association dont la clé est identique (pour la fonction de comp...
Table * creer_table(int(*comparer_cle)(const intptr_t cle1, const intptr_t cle2), intptr_t(*copier_cle)(const intptr_t cle), void(*supprimer_cle)(intptr_t cle))
Renvoie une nouvelle table.
void add_table(Table *table, const intptr_t cle, const intptr_t valeur)
La fonction add_table() ajoute une association entre une clé et une valeur. Pour cela, add_table(), crée une copie de la clé passée en paramètre, l'enregistre dans la table et l'associe à la valeur passée en paramètre. La mémoire de la copie de la clé est gérée par la table. La mémoire de la clé passée en paramètre reste à la charge de l'utilisateur.