Man page - tdestroy(3)

Packages contains this manual

Available languages:

en fr ja ru

Manual

tsearch

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ATTRIBUTS
STANDARDS
HISTORIQUE
NOTES
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

tsearch, tfind, tdelete, twalk, twalk_r, tdestroy - Manipuler un arbre binaire de recherche

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <search.h>

typedef enum { preorder, postorder, endorder, leaf } VISIT;

void *tsearch(const void * key , void ** rootp ,
int (*
compar )(const void *, const void *));
void *tfind(const void *
key , void *const * rootp ,
int (*
compar )(const void *, const void *));
void *tdelete(const void *restrict
key , void **restrict rootp ,
int (*
compar )(const void *, const void *));
void twalk(const void *
root ,
void (*
action )(const void * nodep , VISIT which ,
int
depth ));

#define _GNU_SOURCE /* Consultez feature_test_macros(7) */
#include <search.h>

void twalk_r(const void * root ,
void (*
action )(const void * nodep , VISIT which ,
void *
closure ),
void *
closure );
void tdestroy(void *
root , void (* free_node )(void * nodep ));

DESCRIPTION

tsearch (), tfind (), twalk () et tdelete () permettent de manipuler un arbre binaire de recherche. Ces fonctions implĂ©mentent une gĂ©nĂ©ralisation de l’algorithme T de Knuth (6.2.2). Le premier membre de chaque nƓud de l’arbre est un pointeur vers la donnĂ©e elle-mĂȘme (le programme appelant doit prendre en charge le stockage de ces donnĂ©es). compar pointe sur une routine de comparaison prenant en argument deux pointeurs sur ces donnĂ©es. Elle doit renvoyer un entier nĂ©gatif, nul, ou positif suivant que le premier Ă©lĂ©ment est infĂ©rieur, Ă©gal ou supĂ©rieur au second.

tsearch () recherche un Ă©lĂ©ment dans l’arbre. key pointe sur l’élĂ©ment Ă  chercher. rootp pointe vers une variable qui pointe vers la racine de l’arbre. Si l’arbre est vide, alors rootp doit pointer sur une variable devant ĂȘtre rĂ©glĂ©e Ă  NULL . Si l’élĂ©ment est trouvĂ© dans l’arbre, tsearch () renvoie un pointeur sur le nƓud de l’arbre correspondant. (En d’autres termes, tsearch () retourne un pointeur sur un pointeur sur l’élĂ©ment.) Si l’élĂ©ment n’est pas trouvĂ©, tsearch () l’ajoute dans l’arbre et renvoie un pointeur sur le nƓud de l’arbre correspondant.

tfind () fonctionne comme tsearch (), sauf que si l’élĂ©ment n’est pas trouvĂ©, la fonction tfind () renvoie NULL .

tdelete () supprime un Ă©lĂ©ment de l’arbre. Ses arguments sont les mĂȘmes que ceux de tsearch ().

twalk () exĂ©cute un parcours en profondeur d’abord, de gauche Ă  droite ensuite, de l’arbre binaire. root pointe sur le nƓud de dĂ©part du parcours. S’il ne s’agit pas de la vraie racine de l’arbre, seule une partie de celui-ci sera balayĂ©. twalk () appelle la fonction action chaque fois qu’un nƓud est rencontrĂ© (c’est-Ă -dire trois fois pour un nƓud interne et une seule fois pour une feuille de l’arbre). action doit accepter trois arguments. Le premier argument est un pointeur sur le nƓud rencontrĂ©. La structure du nƓud n’est pas spĂ©cifiĂ©e, mais il est possible de transformer le pointeur sous forme de pointeur-vers-pointeur-vers-Ă©lĂ©ment afin d’accĂ©der Ă  l’élĂ©ment enregistrĂ© dans le nƓud. L’application ne doit pas modifier la structure pointĂ©e par cet argument. Le deuxiĂšme argument est un entier prenant l’une des valeurs suivantes : preorder , postorder ou endorder suivant qu’il s’agisse de la premiĂšre, deuxiĂšme ou troisiĂšme rencontre du nƓud, ou la valeur leaf s’il s’agit d’un nƓud feuille (ces symboles sont dĂ©finis dans <search.h> ). Le troisiĂšme argument est la profondeur du nƓud dans l’arbre, le nƓud racine ayant la profondeur zĂ©ro.

Ordinairement, preorder , postorder et endorder sont connus sous le nom preorder (prĂ©fixe), inorder (infixe), et postorder (postfixe) : avant de visiter le nƓud fils, aprĂšs le premier et avant le second, aprĂšs avoir visitĂ© les enfants. Ainsi, le choix du nom postorder est un peu dĂ©routant.

twalk_r () est similaire Ă  twalk (), mais Ă  la place de l’argument depth , le pointeur argument closure est passĂ© Ă  chaque invocation de la fonction de rappel d’action, inchangĂ©. Ce pointeur peut ĂȘtre utilisĂ© pour passer de l’information vers et depuis la fonction de rappel de façon sĂ»re pour les threads, sans utiliser de variables globales.

tdestroy () supprime tout l’arbre pointĂ© par root , libĂ©rant toutes les ressources allouĂ©es par la fonction tsearch (). Pour libĂ©rer les donnĂ©es de chaque nƓud, la fonction free_node est invoquĂ©e. Le pointeur sur les donnĂ©es est passĂ© en argument Ă  cette fonction. Si aucune libĂ©ration n’est nĂ©cessaire, free_node doit pointer vers une fonction ne faisant rien.

VALEUR RENVOYÉE

tsearch () renvoie un pointeur sur un nƓud correspondant de l’arbre, ou sur le nƓud nouvellement ajoutĂ©, ou NULL s’il n’y avait pas assez de mĂ©moire pour ajouter le nƓud. tfind () renvoie un pointeur sur le nƓud recherchĂ©, ou NULL si aucune correspondance n’a Ă©tĂ© trouvĂ©e. Si plusieurs Ă©lĂ©ments correspondent Ă  la clĂ©, l’élĂ©ment dont le nƓud est renvoyĂ© n’est pas spĂ©cifiĂ©.

tdelete () renvoie un pointeur sur le nƓud pĂšre de celui dĂ©truit, ou NULL si l’élĂ©ment n’a pas Ă©tĂ© trouvĂ©. Si le nƓud dĂ©truit Ă©tait le nƓud racine, tdelete () renvoie un pointer ne pointant sur aucun objet valable et auquel il ne faut pas accĂ©der.

tsearch (), tfind () et tdelete () renvoient également NULL si rootp valait NULL .

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3869112-1.png

STANDARDS

tsearch ()
tfind
()
tdelete
()
twalk
()

POSIX.1-2008.

tdestroy ()
twalk_r
()

GNU.

HISTORIQUE

tsearch ()
tfind
()
tdelete
()
twalk
()

POSIX.1-2001, POSIX.1-2008, SVr4.

twalk_r ()

glibc 2.30.

NOTES

twalk () utilise un pointeur sur la racine, alors que les autres fonctions utilisent un pointeur sur une variable pointant sur la racine.

tdelete () libĂšre la mĂ©moire nĂ©cessaire au stockage du nƓud dans l’arbre. Le programme appelant est responsable de la libĂ©ration de la mĂ©moire occupĂ©e par l’élĂ©ment de donnĂ©es correspondant.

Le programme d’exemple s’appuie sur le fait que twalk () ne fait plus jamais rĂ©fĂ©rence Ă  un nƓud aprĂšs avoir appelĂ© la fonction utilisateur avec l’argument « endorder » ou « leaf ». Ceci fonctionne avec l’implĂ©mentation de la bibliothĂšque GNU, mais n’est pas spĂ©cifiĂ© sous System V.

EXEMPLES

Le programme suivant insĂšre douze nombres alĂ©atoires dans un arbre binaire, oĂč les doublons sont supprimĂ©s, puis affiche les nombres classĂ©s.

#define _GNU_SOURCE /* Expose la déclaration de tdestroy() */
#include <search.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static void *root = NULL;
static void *
xmalloc(size_t n)
{
void *p;
p = malloc(n);
if (p)
return p;
fprintf(stderr, "mémoire insuffisante\n");
exit(EXIT_FAILURE);
}
static int
compare(const void *pa, const void *pb)
{
if (*(int *) pa < *(int *) pb)
return -1;
if (*(int *) pa > *(int *) pb)
return 1;
return 0;
}
static void
action(const void *nodep, VISIT which, int depth)
{
int *datap;
switch (which) {
case preorder:
break;
case postorder:
datap = *(int **) nodep;
printf("%6d\n", *datap);
break;
case endorder:
break;
case leaf:
datap = *(int **) nodep;
printf("%6d\n", *datap);
break;
}
}
int
main(void)
{
int *ptr;
int **val;
srand(time(NULL));
for (unsigned int i = 0; i < 12; i++) {
ptr = xmalloc(sizeof(*ptr));
*ptr = rand() & 0xff;
val = tsearch(ptr, &root, compare);
if (val == NULL)
exit(EXIT_FAILURE);
if (*val != ptr)
free(ptr);
}
twalk(root, action);
tdestroy(root, free);
exit(EXIT_SUCCESS);
}

VOIR AUSSI

bsearch (3), hsearch (3), lsearch (3), qsort (3)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Jean-Baptiste Holcroft <jean-baptiste@holcroft.fr> et Grégoire Scano <gregoire.scano@malloc.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .