summaryrefslogtreecommitdiff
path: root/man3/tsearch.3
diff options
context:
space:
mode:
Diffstat (limited to 'man3/tsearch.3')
-rw-r--r--man3/tsearch.3200
1 files changed, 200 insertions, 0 deletions
diff --git a/man3/tsearch.3 b/man3/tsearch.3
new file mode 100644
index 000000000..f592f3bf8
--- /dev/null
+++ b/man3/tsearch.3
@@ -0,0 +1,200 @@
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\" Copyright 1995 by Jim Van Zandt <jrv@vanzandt.mv.com>
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.TH TSEARCH 3 1995-09-24 "GNU" "Linux Programmer's Manual"
+.SH NAME
+tsearch, tfind, tdelete, twalk \- manage a binary tree
+.SH SYNOPSIS
+.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 "));"
+.sp
+.B #define _GNU_SOURCE
+.br
+.B #include <search.h>
+.sp
+.BI "void tdestroy (void *" root ", void (*" free_node ")(void *" nodep ));
+.RE
+.fi
+.SH DESCRIPTION
+\fBtsearch\fP, \fBtfind\fP, \fBtwalk\fP, and \fBtdelete\fP manage a
+binary tree. They are generalized from Knuth (6.2.2) Algorithm T.
+The first field in each node of the tree is a pointer to the
+corresponding data item. (The calling program must store the actual
+data.) \fIcompar\fP points to a comparison routine, which takes
+pointers to two items. It should return an integer which is negative,
+zero, or positive, depending on whether the first item is less than,
+equal to, or greater than the second.
+.PP
+\fBtsearch\fP searches the tree for an item. \fIkey\fP
+points to the item to be searched for. \fIrootp\fP points to a
+variable which points to the root of the tree. If the tree is empty,
+then the variable that \fIrootp\fP points to should be set to \fBNULL\fP.
+If the item is found in the tree, then \fBtsearch\fP returns a pointer
+to it. If it is not found, then \fBtsearch\fP adds it, and returns a
+pointer to the newly added item.
+.PP
+\fBtfind\fP is like \fBtsearch\fP, except that if the item is not
+found, then \fBtfind\fP returns \fBNULL\fP.
+.PP
+\fBtdelete\fP deletes an item from the tree. Its arguments are the
+same as for \fBtsearch\fP.
+.PP
+\fBtwalk\fP performs depth-first, left-to-right traversal of a binary
+tree. \fIroot\fP points to the starting node for the traversal. If
+that node is not the root, then only part of the tree will be visited.
+\fBtwalk\fP calls the user function \fIaction\fP each time a node is
+visited (that is, three times for an internal node, and once for a
+leaf). \fIaction\fP, in turn, takes three arguments. The first is a
+pointer to the node being visited. The second is an integer which
+takes on the values \fBpreorder\fP, \fBpostorder\fP, and
+\fBendorder\fP depending on whether this is the first, second, or
+third visit to the internal node, or \fBleaf\fP if it is the single
+visit to a leaf node. (These symbols are defined in
+\fI<search.h>\fP.) The third argument is the depth of the node, with
+zero being the root.
+.PP
+(More commonly, \fBpreorder\fP, \fBpostorder\fP, and \fBendorder\fP
+are known as \fBpreorder\fP, \fBinorder\fP, and \fBpostorder\fP:
+before visiting the children, after the first and before the second,
+and after visiting the children. Thus, the choice of name \fBpost\%order\fP
+is rather confusing.)
+.PP
+\fBtdestroy\fP removes the whole tree pointed to by \fIrootp\fP,
+freeing all resources allocated by the \fBtsearch\fP function. For
+the data in each tree node the function \fIfree_node\fP is called.
+The pointer to the data is passed as the argument to the function. If
+no such work is necessary \fIfree_node\fP must point to a function
+doing nothing.
+.SH "RETURN VALUE"
+\fBtsearch\fP returns a pointer to a matching item in the tree, or to
+the newly added item, or \fBNULL\fP if there was insufficient memory
+to add the item. \fBtfind\fP returns a pointer to the item, or
+\fBNULL\fP if no match is found. If there
+are multiple elements that match the key, the element returned is
+unspecified.
+.PP
+\fBtdelete\fP returns a pointer to the parent of the item deleted, or
+\fBNULL\fP if the item was not found.
+.PP
+\fBtsearch\fP, \fBtfind\fP, and \fBtdelete\fP also
+return \fBNULL\fP if \fIrootp\fP was \fBNULL\fP on entry.
+.SH WARNINGS
+\fBtwalk\fP takes a pointer to the root, while the other functions
+take a pointer to a variable which points to the root.
+.PP
+\fBtwalk\fP uses \fBpostorder\fP to mean "after the left subtree, but
+before the right subtree". Some authorities would call this
+"inorder", and reserve "postorder" to mean "after both subtrees".
+.PP
+\fBtdelete\fP frees the memory required for the node in the tree.
+The user is responsible for freeing the memory for the corresponding
+data.
+.PP
+The example program depends on the fact that \fBtwalk\fP makes no
+further reference to a node after calling the user function with
+argument "endorder" or "leaf". This works with the GNU library
+implementation, but is not in the SysV documentation.
+.SH EXAMPLE
+The following program inserts twelve random numbers into a binary
+tree, where duplicate numbers are collapsed, then prints the numbers
+in order.
+.sp
+.nf
+ #include <search.h>
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <time.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;
+
+ 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() {
+ int i, *ptr;
+ void *val;
+
+ srand(time(NULL));
+ 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 "CONFORMING TO"
+SVID.
+The function
+.B tdestroy()
+is a GNU extension.
+.SH "SEE ALSO"
+.BR bsearch (3),
+.BR hsearch (3),
+.BR lsearch (3),
+.BR qsort (3)