home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d5xx
/
d519
/
avlsort.lha
/
AVLSort
/
avltree.man
< prev
next >
Wrap
Text File
|
1991-07-22
|
8KB
|
199 lines
AVL(n) UNIX 5.0 AVL(n)
NAME
avl - General Purpose AVL tree subroutines
SYNOPSIS
#include "avl.h"
AVLNODE *avlfind( treeP, keyP )
AVLTREE *treeP;
void *keyP;
int avlinsert( treeP, keyP, dataP )
AVLTREE *treeP;
void *keyP;
void *dataP;
int avldelete( treeP, keyP )
AVLTREE *treeP;
void *keyP;
SYNOPSIS
avlfind searches an AVL tree for a node that matches a given
key, according to the key comparison routine specified in
the tree description structure. treeP is the address of the
tree description block; keyP is the address of a key; this
is given to the key comparison routine specified in the tree
description structure. Its interpretation, if any, is left
to the comparison routine. avlfind returns the address of
the node found, or NULL if none found.
avlinsert inserts a new node into an AVL tree. treeP is the
address of the tree description structure; keyP is the
address of a key; this address is given to the key
comparison routine and the node construction routines
specified in the tree description structure, and is not
otherwise handled by avlinsert. avlinsert returns -1 if
there was a failure of some sort; 0 if the node was
inserted; 1 if the key was already in the tree (and the node
construction routine rejected the duplication).
avldelete deletes a node from an AVL tree. treeP is the
address of the tree description structure; keyP is the
address of the key that identifies the node to be deleted -
it is given to the key comparison routine specified in the
tree description structure in the process of locating the
node to delete. avldelete returns 0 if the node was
deleted, -1 if it was not found in the tree.
Note well: all node addresses refer to the address of
AVLNODE structures; typically an AVLNODE structure will be
imbedded in an enveloping structure that contains key and/or
data information. Nevertheless, the AVL routines require,
pass, and return the AVLNODE node structure address, not the
Page 1 (printed 6/3/88)
AVL(n) UNIX 5.0 AVL(n)
address of the containing structure (if any). In most
cases, arranging to have the AVLNODE structure address be
the same as the general structure address (i.e., be the
first element within that structure) is the best thing to
do, so that address translation is not necessary. In the
case of multiple membership, this is obviously not possible.
DESCRIPTION
These routines are a general-purpose implementation of AVL
trees in C. They are derived, with small changes, from the
description of AVL (Adelson-Velskii and Landis) trees found
in Knuth's "The Art of Computer Programming Volume 3:
Searching and Sorting" (Addison-Wesley, 1973) pgs 451-471.
These routines deal with tree maintenance only. They are
only concerned with the arrangement of the nodes in the
tree. Composition of those nodes is left to outside
knowledge. The caller must construct an AVL tree header
structure which specifies routines that deal with nodes
(comparison, construction, and deletion). AVL nodes
therefore do not need to contain any specific kind of key,
or data, or even both key and data. For instance, the
address of an AVL node may imply this information without
the information being present. Also, multiple AVL nodes may
be attached to a particular piece of data so that that data
may be keyed and accessed in multiple ways.
RELATED INFORMATION
The AVL tree header (AVLTREE) has the following structure:
typedef struct {
/* Tree parameters */
AVLNODE *t_rootP; /* Ptr to root node */
/* Handler functions for the tree */
int (*t_cmprtc)(); /* Compare two keys */
AVLNODE *(*t_mknode)(); /* Node maker */
int (*t_rmnode)(); /* Node destroyer */
} AVLTREE;
Before any use of AVL routines, the handler functions must
be specified. We'll refer to them as simply cmprtc, mknode,
and rmnode.
int cmprtc( keyP, nodeP )
void *keyP;
AVLNODE *nodeP;
AVLNODE *mknode( treeP, keyP, dataP, enodeP )
AVLTREE *treeP;
void *keyP;
Page 2 (printed 6/3/88)
AVL(n) UNIX 5.0 AVL(n)
void *dataP;
AVLNODE *enodeP;
void rmnode( treeP, nodeP )
AVLTREE *treeP;
AVLNODE *nodeP;
cmprtc compares a given key against a key associated with a
node. keyP is the address of a key (interpreted in whatever
way is applicable); nodeP is the address of an AVLNODE
structure to which the key should be compared. It shall
return -1 if keyP is less than the key associated with nodeP
key; 0 if they match; +1 if keyP is greater than the key
associated with nodeP.
mknode creates a node on behalf of tree insertion. treeP is
the address of the tree description structure; keyP is the
address of any key associated with the node; dataP is the
address of any data associated with the node; enodeP is the
address of any node that already exists in the tree for
keyP. If enodeP is not NULL, then this routine is being
called to replace the data in an existing node. It can
signal its unwillingness to do this by returning NULL as its
return value, otherwise it must return the address of the
existing node. Otherwise (if enodeP is not NULL), this
routine should allocate (or otherwise create) a new node and
fill it in. mknode shall return the address of the node
constructed, or NULL if no node was made.
rmnode is called to delete a node and its information.
treeP is the address of the tree description structure;
nodeP is the address of the node to delete. It is called
when a node is removed from a tree; it may do what it likes
and does not return any information.
FILES
avl.h avl.c avl.n avltest.c
RESTRICTIONS
This software may be used at will, provided that all credits
and style be left in place, and that its distribution is not
restricted. Bug fixes and improvements are welcomed, please
send these back to me at mem@zinn.MV.COM
CREDITS TO
Mark E. Mallett (mem@zinn.MV.COM)
BUGS
You tell me..
Page 3 (printed 6/3/88)