Example #1
0
btree_node* btree_insert(btree_node *root, int target)
{
    if(NULL == root)
    {
        return NULL;
    }

    if(2 * M - 1 == root->num)
    {
        btree_node *node = btree_node_new();
        if(NULL == node)
        {
            return root;
        }

        node->is_leaf = 0;
        node->p[0] = root;
        btree_split_child(node, 0, root);
        btree_insert_nonfull(node, target);
        return node;
    }
    else
    {
        btree_insert_nonfull(root, target);
        return root;
    }
}
btree_node *BPlusTree::btree_create()
{
    btree_node *node = btree_node_new();
    if(NULL == node) {
        return NULL;
    }

	node->next = node;
	node->prev = node;

    return node;
}
Example #3
0
int btree_split_child(btree_node *parent, int pos, btree_node *child)
{
    btree_node *new_child = btree_node_new();
    if(NULL == new_child)
    {
        return -1;
    }

    new_child->is_leaf = child->is_leaf;
    new_child->num = M - 1;

    for(int i = 0; i < M - 1; i++)
    {
        new_child->k[i] = child->k[i+M];
    }

    if(false == new_child->is_leaf)
    {
        for(int i = 0; i < M; i++)
        {
            new_child->p[i] = child->p[i+M];
        }
    }

    child->num = M - 1;
    if(true == child->is_leaf)
    {
        child->num++;  // if leaf, keep the middle ele, put it in the left
    }

    for(int i = parent->num; i > pos; i--)
    {
        parent->p[i+1] = parent->p[i];
    }
    parent->p[pos+1] = new_child;

    for(int i = parent->num - 1; i >= pos; i--)
    {
        parent->k[i+1] = parent->k[i];
    }
    parent->k[pos] = child->k[M-1];

    parent->num += 1;

    // update link
    if(true == child->is_leaf)
    {
        new_child->next = child->next;
        child->next->prev = new_child;
        new_child->prev = child;
        child->next = new_child;
    }
}