diff options
author | alfred <alfred@FreeBSD.org> | 2000-07-01 06:55:11 +0000 |
---|---|---|
committer | alfred <alfred@FreeBSD.org> | 2000-07-01 06:55:11 +0000 |
commit | 5a1e6c960d9a13a4078c249a02eea6c731abd3c5 (patch) | |
tree | ac4858db9bf0905af84e0d5b7542d95bf1cd9e17 /lib/libc/stdlib/twalk.c | |
parent | 2cd7c167097741abca2a3cd42f54cd066b988858 (diff) | |
download | FreeBSD-src-5a1e6c960d9a13a4078c249a02eea6c731abd3c5.zip FreeBSD-src-5a1e6c960d9a13a4078c249a02eea6c731abd3c5.tar.gz |
bring in binary search tree code.
Obtained from: NetBSD
Diffstat (limited to 'lib/libc/stdlib/twalk.c')
-rw-r--r-- | lib/libc/stdlib/twalk.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/lib/libc/stdlib/twalk.c b/lib/libc/stdlib/twalk.c new file mode 100644 index 0000000..eab71df --- /dev/null +++ b/lib/libc/stdlib/twalk.c @@ -0,0 +1,57 @@ +/* $NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos Exp $ */ +/* $FreeBSD$ */ + +/* + * Tree search generalized from Knuth (6.2.2) Algorithm T just like + * the AT&T man page says. + * + * The node_t structure is for internal use only, lint doesn't grok it. + * + * Written by reading the System V Interface Definition, not the code. + * + * Totally public domain. + */ + +#include <sys/cdefs.h> +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include <assert.h> +#define _SEARCH_PRIVATE +#include <search.h> +#include <stdlib.h> + +static void trecurse __P((const node_t *, + void (*action)(const void *, VISIT, int), int level)); + +/* Walk the nodes of a tree */ +static void +trecurse(root, action, level) + const node_t *root; /* Root of the tree to be walked */ + void (*action) __P((const void *, VISIT, int)); + int level; +{ + + if (root->llink == NULL && root->rlink == NULL) + (*action)(root, leaf, level); + else { + (*action)(root, preorder, level); + if (root->llink != NULL) + trecurse(root->llink, action, level + 1); + (*action)(root, postorder, level); + if (root->rlink != NULL) + trecurse(root->rlink, action, level + 1); + (*action)(root, endorder, level); + } +} + +/* Walk the nodes of a tree */ +void +twalk(vroot, action) + const void *vroot; /* Root of the tree to be walked */ + void (*action) __P((const void *, VISIT, int)); +{ + if (vroot != NULL && action != NULL) + trecurse(vroot, action, 0); +} |