From 4db792b46b498aca58e0c60c3693325b0b418fd9 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 24 Sep 2021 15:44:36 +0200 Subject: [PATCH] Add bintree_insert --- bintree.c | 15 ++++++++++----- bintree.h | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/bintree.c b/bintree.c index f21403a..e055f57 100644 --- 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; diff --git a/bintree.h b/bintree.h index 36099f1..171eb35 100644 --- 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); -- 2.44.0