
/* FILE: avl.h */
/* definitions for AVL tree routines... */
#ifndef _AVL_H
#define _AVL_H

/*
    Types defined: (defined in avl.h)

        TAVLTree  -- Struct containing root ptr, current compare func, etc.
        PAVLTree  -- Pointer to AVLTree structure

        TAVLNode  -- Struct containing the data record, ptrs to chldrn, and
                     the balance factor
        PAVLNode  -- Pointer to AVLNode structure
        PPAVLNode -- Pointer to pointer to AVLNode structure

        EAVLBal   -- Enum of balance factor values

        EAVLOrd   -- Enum of traversal orders

        EAVLErr   -- Enum of AVL routine error codes
        CAVLEmsg  -- Constant array of error messages corres. w/ EAVLErr

    Exported functions:

        int AVL_AddNode(PAVLTree tree, PRec rec) 
                --> Adds a node containing 'rec' to tree pointed to by 
                    '*root'.  Returns non-zero on error.

        int AVL_DelNode(PAVLTree tree, PRec rec)
                --> Searches tree '*tree' for key matching 'rec' and deletes
                    Returns non-zero on error

        int AVL_SearchTree(PAVLTree tree, PRec rec, PPAVLNode node)
                --> Searches tree '*tree' for node matching 'rec' by key
                    using the current key comparison function, and places 
                    result in '*node'.  Returns non-zero on error.

        int AVL_SearchWholeTree
            (PAVLTree tree, PRec rec, PPAVLNode node, int (*comp)(PRec,PRec))
                --> Performs an inorder traversal on '*tree' until it
                    finds 'rec', using 'comp' as its comparison function.
                    If found, it places the node pointer in '*node'.
                    Returns non-zero on error.

        int AVL_InitTree(PAVLTree tree)
                --> Initializes the AVLTree struct 'tree'

        int AVL_Traverse(PAVLTree tree, EAVLOrd order, int (*act)(PRec))
                --> Traverses tree 'tree' in order 'order', performing
                    'act' on each record.  If 'act' returns non-zero,
                    that value is returned to the caller.  Otherwise
                    zero is returned.

        int AVL_KillTree(PAVLTree tree)
                --> Deallocates all records and nodes within '*tree'

        int AVL_KillJustTree(PAVLTree tree)
                --> Deallocates all nodes within '*tree', leaving the
                    records intact (that way, the AVL tree can be used
                    as a container for records that may be stored in
                    another structure as well.)

        int AVL_SetTreeComp(PAVLTree tree, int (*comp)(PRec, PRec))
                --> Sets the compare function for '*tree' to 'comp()'
                    'comp' should be defined as 'int comp(PRec,PRec);'

*/

typedef enum { LeftHigh, RightHigh, Balanced } EAVLBal;

typedef struct tAVLNode * PAVLNode;

typedef struct tAVLNode {
    PAVLNode    l;
    PAVLNode    r;
    EAVLBal     bal;
    void *      rec;  /* No AVL functions ever dereference rec. */
} TAVLNode;

typedef PAVLNode * PPAVLNode;

typedef struct tAVLTree {
    PAVLNode    root;
    int         (*comp)(void *,void *);
} TAVLTree;

typedef struct tAVLTree * PAVLTree;

typedef enum { InOrder, PreOrder, PostOrder } EAVLOrd;

typedef enum {
  EAVL_NOERR=0, EAVL_NULLTREE, EAVL_NOTFOUND, EAVL_DUPREC, EAVL_NOCOMP,
  EAVL_COMPCHG
} EAVLErr;

extern char * CAVLEmsg[];   /* Error message array in avl.c */

int     AVL_AddNode     (PAVLTree tree, void * rec);
int     AVL_Traverse    (PAVLTree tree, EAVLOrd order, int (*act)(void *));
int     AVL_SearchTree  (PAVLTree tree, void * rec, void ** node);
int     AVL_SearchWholeTree
    (PAVLTree tree, void * rec, PPAVLNode node, int (*comp)(void *,void *));
int     AVL_KillTree    (PAVLTree tree);
int     AVL_KillJustTree
                        (PAVLTree tree);
int     AVL_SetTreeComp (PAVLTree tree, int (*comp)(void *,void *));
int     AVL_InitTree    (PAVLTree tree);
int     AVL_DelNode     (PAVLTree tree, void * rec);
void    AVL_DumpTreeInfo(PAVLTree tree,int (*act)(void *));

#endif

/* ======================================================================== */
/*  This program is free software; you can redistribute it and/or modify    */
/*  it under the terms of the GNU General Public License as published by    */
/*  the Free Software Foundation; either version 2 of the License, or       */
/*  (at your option) any later version.                                     */
/*                                                                          */
/*  This program is distributed in the hope that it will be useful,         */
/*  but WITHOUT ANY WARRANTY; without even the implied warranty of          */
/*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU       */
/*  General Public License for more details.                                */
/*                                                                          */
/*  You should have received a copy of the GNU General Public License       */
/*  along with this program; if not, write to the Free Software             */
/*  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.               */
/* ======================================================================== */
/*                 Copyright (c) 1998-2001, Joseph Zbiciak                  */
/* ======================================================================== */
