AVL Tree iterator functions added.
FossilOrigin-Name: d6c27caab24a9b6773796a05192a7bed9c8ed2e19d660ba6e1e6f0a80cbe0d6a
This commit is contained in:
parent
eadc16f241
commit
112388f55d
@ -28,6 +28,9 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define AVLTREE_MAX_DEPTH 32
|
||||||
|
|
||||||
struct avlnode {
|
struct avlnode {
|
||||||
void *data;
|
void *data;
|
||||||
@ -44,6 +47,9 @@ struct avltree {
|
|||||||
int count;
|
int count;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct avltree * avltree_t;
|
||||||
|
|
||||||
|
|
||||||
void avlnode_destroy(struct avltree *t, struct avlnode *n);
|
void avlnode_destroy(struct avltree *t, struct avlnode *n);
|
||||||
|
|
||||||
struct avltree *avltree_create(int (*cmp) (const void *, const void *),
|
struct avltree *avltree_create(int (*cmp) (const void *, const void *),
|
||||||
@ -83,6 +89,7 @@ static inline void avltree_destroy(struct avltree *t)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define avltree_find(t,d) avltree_get(t,d)
|
#define avltree_find(t,d) avltree_get(t,d)
|
||||||
#define avltree_insert(t,d) avltree_add(t,d)
|
#define avltree_insert(t,d) avltree_add(t,d)
|
||||||
//#define avltree_walk(t,dir) avltree_foreach(t,dir)
|
//#define avltree_walk(t,dir) avltree_foreach(t,dir)
|
||||||
@ -93,4 +100,45 @@ static inline void avltree_destroy(struct avltree *t)
|
|||||||
#define avltree_foreach_from_asc(t,d,cb,priv) avltree_foreach_from_lr(t,(t)->root,d,cb,priv);
|
#define avltree_foreach_from_asc(t,d,cb,priv) avltree_foreach_from_lr(t,(t)->root,d,cb,priv);
|
||||||
|
|
||||||
|
|
||||||
|
struct avliter{
|
||||||
|
struct avlnode *stack[AVLTREE_MAX_DEPTH*2];
|
||||||
|
|
||||||
|
struct avlnode *cur;
|
||||||
|
int stack_ptr;
|
||||||
|
struct avlnode * root;
|
||||||
|
|
||||||
|
};
|
||||||
|
typedef struct avliter avliter_t;
|
||||||
|
|
||||||
|
|
||||||
|
void * avliter_next(avliter_t *i);
|
||||||
|
|
||||||
|
void * avliter_seek_set(struct avliter *i)
|
||||||
|
{
|
||||||
|
i->stack_ptr=0;
|
||||||
|
i->cur=i->root;
|
||||||
|
return avliter_next(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void avliter_init(avliter_t *i, avltree_t t){
|
||||||
|
i->root = t->root;
|
||||||
|
i->stack_ptr=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define avliter_foreach_asc(iter,val) \
|
||||||
|
while(NULL != (val = avliter_next(iter)))
|
||||||
|
|
||||||
|
static inline void * avliter_get(avliter_t *i){
|
||||||
|
if(!i->cur)
|
||||||
|
return NULL;
|
||||||
|
return i->cur->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user