This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/semweb/avl.h

132 lines
3.9 KiB
C

/** <plaintext>
*
* avl.h -- public types and external declarations for avl trees
*
* Created 03/01/89 by Brad Appleton
*
* ^{Mods:* }
*
* Fri Jul 14 13:54:12 1989, Rev 1.0, brad(0165)
*
**/
#ifndef AVL_H_INCLUDED
#define AVL_H_INCLUDED
/* definition of traversal type */
typedef enum { PREORDER, INORDER, POSTORDER } VISIT;
/* definition of sibling order type */
typedef enum { LEFT_TO_RIGHT, RIGHT_TO_LEFT } SIBLING_ORDER;
/* definition of node type */
typedef enum { IS_TREE, IS_LBRANCH, IS_RBRANCH, IS_LEAF, IS_NULL } NODE;
/* definition of a NULL action and a NULL tree */
#define NULL_ACTION ((void(*)()) NULL)
#define NULL_TREE ((AVLtree) NULL)
/* BEGIN Internal definitions */
/* Directional Definitions */
typedef short DIRECTION;
#define LEFT 0
#define RIGHT 1
#define OPPOSITE(x) (1 - (x))
/* return codes used by avl_insert(), avl_delete(), and balance() */
#define HEIGHT_UNCHANGED 0
#define HEIGHT_CHANGED 1
/* Balance Definitions */
#define LEFT_HEAVY -1
#define BALANCED 0
#define RIGHT_HEAVY 1
#define LEFT_IMBALANCE(nd) ((nd)->bal < LEFT_HEAVY)
#define RIGHT_IMBALANCE(nd) ((nd)->bal > RIGHT_HEAVY)
/* structure for a node in an AVL tree */
typedef struct avl_node
{ struct avl_node *subtree[2]; /* LEFT and RIGHT subtrees */
short bal; /* balance factor */
void * data[1]; /* data on my back */
} AVLnode, *AVLtree;
/* End Internal definitions */
/* structure which holds information about an AVL tree */
typedef struct avl_tree
{ AVLtree root; /* pointer to the root node of the tree */
long count; /* number of nodes in the tree */
/* function used to compare keys */
void *client_data; /* arbitrary client data */
int (*compar)(void *l, void*r, NODE type);
void (*destroy)(void *data);
void* (*alloc)(void *cdata, size_t size);
void (*free)(void *cdata, void* data, size_t size);
int isize; /* item data size */
} avl_tree, *AVL_TREE;
#define AVL_ENUM_MAX 32 /* balanced tree, allows for 2**32 */
/* nodes */
typedef struct avl_enum
{ AVL_TREE tree;
int current;
AVLtree parents[AVL_ENUM_MAX];
} avl_enum;
void *avlfindfirst(AVL_TREE tree, void *key, avl_enum *e);
void *avlfindnext(avl_enum *e);
void avlfinddestroy(avl_enum *e);
/* Constructor and Destructor functions for AVL trees:
* avlfree is a macro for avldispose in the fashion
* of free(). It assumes certain default values
* (shown below) for the deallocation function and
* for the order in which children are traversed.
*/
extern AVL_TREE avlinit(AVL_TREE tree,
void *cdata, size_t isize,
int (*compare)(void *l, void*r, NODE type),
void (*destroy)(void *d),
void* (*alloc)(void *cdata, size_t bytes),
void (*free)(void *cdata, void *ptr, size_t size));
extern void avlfree(AVL_TREE tree);
/* Routine for manipulating/accessing each data item in a tree */
extern void avlwalk(AVL_TREE,
void (*action)(void *data,
SIBLING_ORDER order,
NODE type,
int level,
int balance),
SIBLING_ORDER);
/* Routine for obtaining the size of an AVL tree */
extern int avlcount(AVL_TREE);
/* Routines to search for a given item */
extern void *avlins(AVL_TREE tree, void *data);
extern int avldel(AVL_TREE tree, void *data);
extern void *avlfind(AVL_TREE tree, void *data);
/* Routines to search for the minimal item of a tree */
extern int avldelmin(AVL_TREE tree, void *data);
extern void *avlfindmin(AVL_TREE tree);
/* Routines to search for the maximal item of a tree */
extern int avldelmax(AVL_TREE tree, void *data);
extern void *avlfindmax(AVL_TREE tree);
#endif /* AVL_H_INCLUDED */