File: tsearch.3

package info (click to toggle)
manpages-es 1.24a-6
  • links: PTS
  • area: main
  • in suites: potato
  • size: 4,256 kB
  • ctags: 7
  • sloc: makefile: 66; sh: 62
file content (187 lines) | stat: -rw-r--r-- 7,239 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
.\" Copyright 1995 by Jim Van Zandt <jrv@vanzandt.mv.com>
.\"
.\" Se concede autorizacin para hacer y distribuir copias literales de este 
.\" manual siempre que el aviso de copyright y esta autorizacin se conserven
.\" en todas las copias.
.\"
.\" Se concede autorizacin para copiar y distribuir versiones modificadas de 
.\" este manual bajo las condiciones de copia literal, siempre que el resultado 
.\" completo del trabajo realizado se distribuya bajo los trminos de una 
.\" autorizacin idntica a esta.
.\" 
.\" Como el ncleo y las bibliotecas de Linux estn permanentemente cambiando
.\" esta pgina del manual puede ser incorrecta o estar desactualizada. El 
.\" autor o autores no asumen ninguna responsabilidad sobre los errores u 
.\" omisiones, o por los daos que resulten del uso de la informacin contenida
.\" aqu. Puede que el autor o los autores no hayan tenido el mismo cuidado en
.\" escribir este manual, cuya licencia es libre de cargo, como el que puedan
.\" tener cuando trabajan profesionalmente.
.\" 
.\" Versiones formatadas o procesadas de este manual, si no van acommpaadas 
.\" por la fuente, deben dar a conocer el copyright y los autores de este 
.\" trabajo.
.\"
.\" Traducido por Carlos Gomez Romero (cgomez@databasedm.es)
.TH TSEARCH 3  "24 de Sept. de 1995" "GNU" "Manual del Programador de Linux"
.SH NOMBRE
tsearch, tfind, tdelete, twalk \- manejan un rbol binario 
.SH SINOPSIS
.nf
.B #include <search.h>
.sp
.BI "void *tsearch (const void *" key ", void **" rootp ,
.BI "                int (*" compar ")(const void *, const void *));"
.sp
.BI "void *tfind (const void *" key ", const void **" rootp ,
.BI "                int (*" compar ")(const void *, const void *));"
.sp
.BI "void *tdelete (const void *" key ", void **" rootp ,
.BI "                int (*" compar ")(const void *, const void *));"
.sp
.BI "void twalk (const void *" root ", void (*" action ") (const void *" nodep ,
.BI "                                   const VISIT " which ,
.BI "                                   const int " depth "));"

.RE
.fi
.SH DESCRIPCIN
\fBtsearch\fP, \fBtfind\fP, \fBtwalk\fP y \fBtdelete\fP manejan un rbol 
binario.  Son una generalizacin del algoritmo T de Knuth (6.2.2).
El primer campo de cada nodo del rbol es un puntero al correspondiente 
elemento de datos. (El programa llamante debe almacenar los datos actuales).
\fIcompar\fP apunta a la rutina de comparacin, que toma punteros a los dos 
elementos.  Debe devolver un entero negativo, cero o positivo dependiendo 
de si el primer elemento es menor, igual o mayor que el segundo.
.PP
\fBtsearch\fP busca un elemento en el rbol.  \fIkey\fP apunta al elemento 
buscado.  \fIrootp\fP apunta a la variable que apunta a la raz del rbol.
Si el rbol est vaco la variable a la que apunta \fIrootp\fP debera estar a
\fBNULL\fP.
Si se encuentra el elemento dentro del rbol \fBtsearch\fP devuelve un puntero
al elemento.  Si no lo encuentra, \fBtsearch\fP lo aade y devuelve un puntero 
al nuevo elemento.
.PP
\fBtfind\fP es como \fBtsearch\fP, slo que si no encuentra el elemento 
\fBtfind\fP devuelve \fBNULL\fP.
.PP
\fBtdelete\fP borra un elemento del rbol.  Sus argumentos son los mismos que
los de \fBtsearch\fP.  
.PP
\fBtwalk\fP realiza un recorrido en profundidad o en anchura de un rbol 
binario. \fIroot\fP apunta al nodo de comienzo del recorrido.
Si el nodo no es la raz slo se visitar parte del rbol.
\fBtwalk\fP llama a la funcin de usuario \fIaction\fP cada vez que se visita
un nodo (esto es, tres veces para un nodo interno y una vez para una hoja). 
\fIaction\fP, toma tres argumentos.  El primero es un puntero al nodo que se
est visitando.  El segundo es un entero cuyo valor toma algundo de los 
valores \fBpreorder\fP, \fBpostorder\fP o \fBendorder\fP dependiendo de si
esta es la primera, sregunda o tercera visita al nodo interno o \fBleaf\fP 
si es la nica vez que se visita la hoja.  (Estos smbolos estn definidos 
en \fI<search.h>\fP). El tercer argumento es la profundidad del nodo, 
siendo la profundidad de la raz cero.
.SH "VALOR DEVUELTO"
\fBtsearch\fP devuelve un puntero al elemento igual del rbol, o al elemento
aadido, o \fBNULL\fP si no hubo suficiente memoria para aadir el elemento.  
\fBtfind\fP devuelve un puntero al elemento, o \fBNULL\fP si no se encuentra 
ninguno igual.  Si hay mltiples elementos que concuerdan con la clave el 
elemento devuelto es inespecificado.
.PP
\fBtdelete\fP devuelve un puntero al padre del elemento borrado, o \fBNULL\fP 
si no se encontr el elemento.
.PP
\fBtsearch\fP, \fBtfind\fP, y \fBtdelete\fP devuelven \fBNULL\fP si 
\fIrootp\fP es \fBNULL\fP en la entrada a la funcin.  
.SH ADVERTENCIAS
\fBtwalk\fP toma un puntero a la raz, mientra que las otras funciones toman
un puntero a una variable que apunta a la raz.
.PP
\fBtwalk\fP usa \fBpostorder\fP con el significado "depus del subrbol 
izquierdo y antes del subrbol derecho".  Algunas autoridades llamana a esto 
"inorden" y reservan "postorden" con el significado "despus de ambos 
subrboles".
.PP
\fBtdelete\fP libera la memoria necesaria para el elemento en el rbol.
El usuario es el responsable de liberar la memoria de los correspondientes 
datos.
.PP
El programa de ejemplo depende del hecho de que \fBtwalk\fP no vuelve a 
referenciar a un nodo despus de llamar a la funcin de usuario con el 
argumento "endorder" o "leaf".  Esto funciona con la biblioteca de GNU, pero
no est en la documentacin SysV.  
.SH EJEMPLO
El ejemplo siguiente inserta doce nmeros aleatorios en un rbol binario
e imprime los nmeros en orden.  Los nmeros son eliminados del rbol y
su almacenamiento liberado durante el recorrido.
.sp
.nf
    #include <search.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    void *root=NULL;
    
    void *xmalloc(unsigned n)
    {
      void *p;
      p = malloc(n);
      if(p) return p;
      fprintf(stderr, "insufficient memory\\n");
      exit(1);
    }
    
    int compare(const void *pa, const void *pb)
    {
      if(*(int *)pa < *(int *)pb) return -1;
      if(*(int *)pa > *(int *)pb) return 1;
      return 0;
    }
    
    void action(const void *nodep, const VISIT which, const int depth)
    {
      int *datap;
      void *val;
    
      switch(which)
        {
        case preorder:
          break;
        case postorder:
          datap = *(int **)nodep;
          printf("%6d\\n", *datap);
          break;
        case endorder:
          datap = *(int **)nodep;
          (void)tdelete(datap, &root, compare);
          free(datap);
          break;
        case leaf:
          datap = *(int **)nodep;
          printf("%6d\\n", *datap);
          val = tdelete(datap, &root, compare);
          free(datap);
          break;
        }
      return;
    }
    
    int main()
    {
      int i, *ptr;
      void *val;
    
      for (i = 0; i < 12; i++)
        {
          ptr = (int *)xmalloc(sizeof(int));
          *ptr = rand()&0xff;
          val = tsearch((void *)ptr, &root, compare);
          if(val == NULL) exit(1);
        }
      twalk(root, action);
      return 0;
    }
.fi
.SH "CONFORME A"
SVID
.SH "VASE TAMBIN"
.BR qsort "(3), " bsearch "(3), " hsearch "(3), " lsearch "(3)"