예제 #1
0
파일: avl.c 프로젝트: Hakiko/CShenanigans
void *avl_node_find(const struct avl_node *node, const void *obj,
                    const struct avl_type_info *info) {
    if (!node)
        return NULL;
    int cmp = info->compare(obj, node->obj);
    if (cmp < 0)
        return avl_node_find(node->left, obj, info);
    if (cmp > 0)
        return avl_node_find(node->right, obj, info);
    return node->obj;
}
예제 #2
0
/* find if contains `key` */
static avl_node_t* avl_node_find(avl_node_t* root, avl_key_t key)
{
    if (root == NULL)
        return NULL;
    if (key < root->key)
        return avl_node_find(root->left, key);
    else if (key > root->key)
        return avl_node_find(root->right, key);
    else
        return root;
}
예제 #3
0
/* delete data from tree */
int avl_delete(avl_tree_t* tree, avl_key_t key)
{
    /* find before deletion, faster in missed case but slower in hit case */
    if (tree && avl_node_find(tree->root, key))
    {
        tree->root = avl_remove_node(tree->root, key);
        tree->size--;
        return 1;
    }
    return 0;
}
예제 #4
0
파일: avl.c 프로젝트: Hakiko/CShenanigans
void *avl_find(const struct avl *tree, const void *obj)
{
    return avl_node_find(tree->root, obj, &tree->type);
}
예제 #5
0
/* find if contains `key` */
void* avl_find(avl_tree_t* tree, avl_key_t key)
{
    avl_node_t* node = avl_node_find(tree->root, key);
    return (node != NULL ? node->data : NULL);
}