File: avltrees.h

package info (click to toggle)
gnu-smalltalk 3.1-6
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 33,300 kB
  • ctags: 13,999
  • sloc: ansic: 88,106; sh: 23,223; asm: 7,889; perl: 4,493; cpp: 3,539; awk: 1,483; yacc: 1,355; xml: 1,272; makefile: 1,192; lex: 843; sed: 258; objc: 124
file content (109 lines) | stat: -rw-r--r-- 3,280 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
   AVL Trees
   Copyright 1993-1999 Bruno Haible, <haible@clisp.cons.org>
  
  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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

  To use AVL trees you'll have to implement your own insert and search cores.
  This will avoid us to use callbacks and to drop drammatically performances.
  I know it's not the cleaner way,  but in C (not in C++) to get
  performances and genericity...

  Some example of insert and search follows here. The search is a plain
  normal search over an ordered tree. The insert instead must be implemented
  int two steps: as first thing the code must insert the element in
  order as a leaf in the tree, then the support library function
  avl_rebalance() must be called. Such function will do the
  not trivial work to rebalance the tree if necessary.

-----------------------------------------------------------------------
static inline struct page *avl_search_page_cache(struct inode *inode,
                                           unsigned long offset)
{
  avl_node_t *n = inode->i_avl_page_cache;
  struct page *page;

  while (n)
  {
     page = (struct page *) n;

     if (offset < page->offset)
        n = n->avl_left;
     else if (offset > page->offset)
        n = n->avl_right;
     else
        return page;
  }
  return NULL;
}

static inline struct page *avl_insert_page_cache(struct inode *inode,
                                                unsigned long offset,
                                                avl_node_t *node)
{
  avl_node_t **p = &inode->i_avl_page_cache;
  avl_node_t *parent = NULL;
  struct page *page;

  while (*p)
  {
     parent = *p;
     page = (struct page *) parent;

     if (offset < page->offset)
        p = &(*p)->avl_left;
     else if (offset > page->offset)
        p = &(*p)->avl_right;
     else
        return page;
  }

  node->avl_parent = parent;
  node->avl_left = node->avl_right = NULL;

  *p = node;

  avl_rebalance(node, &inode->i_avl_page_cache);
  return NULL;
}
-----------------------------------------------------------------------
*/

#ifndef        AVLTREES_H
#define        AVLTREES_H

typedef struct avl_node_t
{
  struct avl_node_t *avl_parent;
  struct avl_node_t *avl_right;
  struct avl_node_t *avl_left;
  int avl_height;
}
avl_node_t;

typedef struct avl_traverse_t
{
  struct avl_node_t *node, *parent;
}
avl_traverse_t;

extern void avl_rebalance(avl_node_t *, avl_node_t **);
extern void avl_erase(avl_node_t *, avl_node_t **);
extern void avl_destroy(avl_node_t *);

extern avl_node_t *avl_first(avl_node_t *, avl_traverse_t *);
extern avl_node_t *avl_next(avl_traverse_t *);

#endif /* AVLTREES_H */