joe 4 years ago
parent
commit
1331c95edb
4 changed files with 92 additions and 0 deletions
  1. 1 0
      README.md
  2. 27 0
      include/ds/avltree.h
  3. 63 0
      src/avltree.c
  4. 1 0
      test/test_avl_tree.h

+ 1 - 0
README.md

@@ -14,3 +14,4 @@ Learning programing under Linux
 - Lua
 - Containers in C
 - Algos in C
+- valgrind

+ 27 - 0
include/ds/avltree.h

@@ -5,5 +5,32 @@
  * AVL Tree
  * Self-balancing bianry tree
  */
+#include "common.h"
+#include <stdint.h>
+
+typedef struct _ds_avl_node {
+    DS_TREE_NODE_COMMON(struct _ds_avl_node);
+    int8_t factor;
+    int8_t deleted;
+}ds_avl_node_t;
+
+typedef struct _ds_avl_tree {
+    int size;
+    ds_avl_node_t* root;
+    func_destroyer destroyer;
+    func_comparer comparer;
+}ds_avl_tree_t;
+
+ds_avl_tree_t * ds_avl_tree_new(func_destroyer destroyer, func_comparer comparer);
+int             ds_avl_tree_init(ds_avl_tree_t *tree, func_destroyer destroyer, func_comparer comparer);
+void            ds_avl_tree_destroy(ds_avl_tree_t *tree, int free_tree);
+
+int ds_avl_tree_insert(ds_avl_tree_t *tree, const ds_data_t data);
+int ds_avl_tree_remove(ds_avl_tree_t *tree, const ds_data_t data);
+int ds_avl_tree_lookup(const ds_avl_tree_t *tree, ds_data_t* data);
+
+int ds_avl_tree_size(const ds_avl_tree_t *tree);
+
+int ds_avl_tree_traversal(const ds_avl_tree_t *tree, func_each fn);
 
 #endif

+ 63 - 0
src/avltree.c

@@ -0,0 +1,63 @@
+#include <ds/avltree.h>
+#include <ds/err.h>
+
+extern func_malloc ds_malloc;
+extern func_free ds_free;
+
+
+ds_avl_tree_t * ds_avl_tree_new(func_destroyer destroyer, func_comparer comparer)
+{
+    ds_avl_tree_t * tree = (ds_avl_tree_t*) ds_malloc(sizeof(ds_avl_tree_t));
+    if(!tree) {
+        return NULL;
+    }
+    tree->size = 0;
+    tree->root = NULL;
+    tree->destroyer = destroyer ? destroyer : ds_cb_default_destroyer;
+    tree->comparer = comparer ? comparer : ds_cb_default_comparer;
+    return tree;
+}
+
+int ds_avl_tree_init(ds_avl_tree_t *tree, func_destroyer destroyer, func_comparer comparer)
+{
+    tree->size = 0;
+    tree->root = NULL;
+    tree->destroyer = destroyer ? destroyer : ds_cb_default_destroyer;
+    tree->comparer = comparer ? comparer : ds_cb_default_comparer;
+    return DS_ERR_OK;
+}
+
+void ds_avl_tree_destroy(ds_avl_tree_t *tree, int free_tree)
+{
+}
+
+int ds_avl_tree_insert(ds_avl_tree_t *tree, const ds_data_t data);
+int ds_avl_tree_remove(ds_avl_tree_t *tree, const ds_data_t data);
+int ds_avl_tree_lookup(const ds_avl_tree_t *tree, ds_data_t* data);
+
+inline int ds_avl_tree_size(const ds_avl_tree_t *tree)
+{
+    return tree->size;
+}
+
+int ds_avl_tree_traversal(const ds_avl_tree_t *tree, func_each fn)
+{
+}
+
+int __insert_left(ds_avl_tree_t *tree, const ds_data_t data)
+{
+}
+
+int __insert_right(ds_avl_tree_t *tree, const ds_data_t data)
+{
+}
+
+int __destroy_left(ds_avl_tree_t *tree, ds_avl_node_t *node)
+{
+    
+}
+
+int __destroy_right(ds_avl_tree_t *tree, ds_avl_node_t *node)
+{
+    
+}

+ 1 - 0
test/test_avl_tree.h

@@ -0,0 +1 @@
+