avl.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  3. * Copyright (C) 2005 Red Hat, Inc.
  4. * All rights reserved.
  5. *
  6. * License: GPL (version 3 or any later version).
  7. * See LICENSE for details.
  8. * END COPYRIGHT BLOCK **/
  9. #ifdef HAVE_CONFIG_H
  10. # include <config.h>
  11. #endif
  12. /* avl.h - avl tree definitions */
  13. /*
  14. * Copyright (c) 1993 Regents of the University of Michigan.
  15. * All rights reserved.
  16. *
  17. * Redistribution and use in source and binary forms are permitted
  18. * provided that this notice is preserved and that due credit is given
  19. * to the University of Michigan at Ann Arbor. The name of the University
  20. * may not be used to endorse or promote products derived from this
  21. * software without specific prior written permission. This software
  22. * is provided ``as is'' without express or implied warranty.
  23. */
  24. #ifndef _AVL
  25. #define _AVL
  26. /*
  27. * this structure represents a generic avl tree node.
  28. */
  29. typedef struct avlnode {
  30. caddr_t avl_data;
  31. signed char avl_bf;
  32. struct avlnode *avl_left;
  33. struct avlnode *avl_right;
  34. } Avlnode;
  35. #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
  36. #pragma GCC diagnostic push
  37. #pragma GCC diagnostic ignored "-Wstrict-prototypes"
  38. #endif
  39. #ifndef _IFP
  40. #define _IFP
  41. typedef int (*IFP)(); /* takes undefined arguments */
  42. #endif
  43. #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
  44. #pragma GCC diagnostic pop
  45. #endif
  46. #define NULLAVL ((Avlnode *) NULL)
  47. /* balance factor values */
  48. #define LH -1
  49. #define EH 0
  50. #define RH 1
  51. /* avl routines */
  52. #define avl_getone(x) (x == 0 ? 0 : (x)->avl_data)
  53. #define avl_onenode(x) (x == 0 || ((x)->avl_left == 0 && (x)->avl_right == 0))
  54. extern int avl_insert(Avlnode **root, void *data, IFP fcmp, IFP fdup);
  55. extern caddr_t avl_delete(Avlnode **root, void *data, IFP fcmp );
  56. extern caddr_t avl_find(Avlnode *root, void *data, IFP fcmp );
  57. extern caddr_t avl_getfirst(Avlnode *root );
  58. extern caddr_t avl_getnext(void);
  59. extern int avl_dup_error(void);
  60. extern int avl_apply(Avlnode *root, IFP fn, void *arg, int stopflag, int type);
  61. extern int avl_free(Avlnode *root, IFP dfree);
  62. /* apply traversal types */
  63. #define AVL_PREORDER 1
  64. #define AVL_INORDER 2
  65. #define AVL_POSTORDER 3
  66. /* what apply returns if it ran out of nodes */
  67. #define AVL_NOMORE -6
  68. caddr_t avl_find_lin( Avlnode *root, caddr_t data, IFP fcmp );
  69. #endif /* _AVL */