]> git.lizzy.rs Git - dragonstd.git/commitdiff
Add bintree_insert
authorElias Fleckenstein <eliasfleckenstein@web.de>
Fri, 24 Sep 2021 13:44:36 +0000 (15:44 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Fri, 24 Sep 2021 13:44:36 +0000 (15:44 +0200)
bintree.c
bintree.h

index f21403ab0eab71f1781ab3981507463c9af802f3..e055f577ddb70782cc008e139695ec0bc2cb268a 100644 (file)
--- a/bintree.c
+++ b/bintree.c
@@ -22,17 +22,17 @@ Bintree bintree_create(size_t key_size, BintreeComparator cmp)
        };
 }
 
-static BintreeNode **search_recursive(Bintree *tree, BintreeNode **nodeptr, void *key)
+static BintreeNode **search_recursive(Bintree *tree, BintreeNode **nodeptr, void *key, bool return_existing)
 {
        if (*nodeptr) {
                int cond;
 
-               if ((cond = tree->cmp((*nodeptr)->key, key, tree)) == 0)
+               if ((cond = tree->cmp((*nodeptr)->key, key, tree)) == 0 && return_existing)
                        return nodeptr;
                else if (cond > 0)
-                       return search_recursive(tree, &(*nodeptr)->left, key);
+                       return search_recursive(tree, &(*nodeptr)->left, key, return_existing);
                else
-                       return search_recursive(tree, &(*nodeptr)->right, key);
+                       return search_recursive(tree, &(*nodeptr)->right, key, return_existing);
        } else {
                return nodeptr;
        }
@@ -40,7 +40,7 @@ static BintreeNode **search_recursive(Bintree *tree, BintreeNode **nodeptr, void
 
 BintreeNode **bintree_search(Bintree *tree, void *key)
 {
-       return search_recursive(tree, &tree->root, key);
+       return search_recursive(tree, &tree->root, key, true);
 }
 
 void bintree_add_node(Bintree *tree, BintreeNode **nodeptr, void *key, void *value)
@@ -52,6 +52,11 @@ void bintree_add_node(Bintree *tree, BintreeNode **nodeptr, void *key, void *val
        (*nodeptr)->left = (*nodeptr)->right = NULL;
 }
 
+void bintree_insert(Bintree *tree, void *key, void *value)
+{
+       bintree_add_node(tree, search_recursive(tree, &tree->root, key, false), key, value);
+}
+
 static void bintree_free(BintreeNode *node, void *arg)
 {
        BintreeFreeData *fdata = arg;
index 36099f12930a14813c9c97b5a12a74d1157a4ed1..171eb35fc06f34b2ee7445d605846bea83decef0 100644 (file)
--- a/bintree.h
+++ b/bintree.h
@@ -33,6 +33,7 @@ typedef enum
 Bintree bintree_create(size_t key_size, BintreeComparator cmp);
 BintreeNode **bintree_search(Bintree *tree, void *key);
 void bintree_add_node(Bintree *tree, BintreeNode **nodeptr, void *key, void *value);
+void bintree_insert(Bintree *tree, void *key, void *value);
 void bintree_traverse(Bintree *tree, BintreeTraversion traversion, BintreeTraversionFunction func, void *arg);
 void bintree_clear(Bintree *tree, BintreeTraversionFunction func, void *arg);