示例#1
0
rb_node_t * rb_insert(const key_type key, const value_type value, rb_node_t **root)
{
    rb_node_t  *parent = NULL, *node = NULL;
    int32_t   ret = 0;

    if (( node = rb_search_auxiliary(*root,key,&parent)))
    {
        return NULL;
    }

    node = rb_node_new(key,value);
    node->color = RED;
    node->parent = parent;

    //ret = key - parent->key;

    if ( parent )
    {
        if ( ret > 0 )
        {
            parent->right = node;
        }else if ( ret < 0 )
        {
            parent ->left = node;
        }
    }else
    {
        //空树
        *root = node;
    }

    return rb_insert_rebalance(node,root);

}
示例#2
0
rb_node_t *rb_insert(key_t key, data_t data, rb_node_t *root)
{
	rb_node_t *parent = NULL;
	rb_node_t *node = NULL;

	parent = NULL;

	if ((node = rb_search_auxiliary(key, root, &parent))) {
		return root;
	}

	node = rb_new_node(key, data);
	node->parent = parent;
	node->left = node->right = NULL;
	node->color = RED;

	if(parent) {
		if (parent->key > key) {
			parent->left = node;
		}else {
			parent->right = node;
		}
	}else {
		root = node;
	}
	return rb_insert_rebalance(node, root);
}
示例#3
0
rb_node_t * rb_add_node( rb_node_t* adnode, rb_node_t **root)
{
    rb_node_t  *parent = NULL, *node = NULL;
    int32_t   ret = 0;

    if (( node = rb_search_auxiliary(*root,adnode->key,&parent)))
    {
        //found,cannot insert repeatly,so return
        return NULL;
    }

    adnode->color = RED;
    adnode->parent = parent;

    //ret = adnode->key - parent->key;

    if ( parent )
    {
        if ( ret > 0 )
        {
            parent->right = adnode;
        }else if ( ret < 0 )
        {
            parent ->left = adnode;
        }
    }else
    {
        //空树
        *root = adnode;
    }

    return rb_insert_rebalance(adnode,root);
}
示例#4
0
文件: rbtree.c 项目: 91he/Test
//四、红黑树的插入
//---------------------------------------------------------
//红黑树的插入结点
rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root)
{
	rb_node_t *parent = NULL, *node;

	parent = NULL;
	//调用rb_search_auxiliary找到插入结点的地方
	if((node = rb_search_auxiliary(key, root, &parent))){
		return root;
	}

	node = rb_new_node(key, data);//分配结点
	node->parent = parent;
	node->left = node->right = NULL;
	node->color = RED;

	if(parent){
		if (parent->key > key){
			parent->left = node;
		}else{
			parent->right = node;
		}
	}else{
		root = node;
	}

	return rb_insert_rebalance(node, root);
	//插入结点后,调用rb_insert_rebalance修复红黑树的性质
}
示例#5
0
文件: rbtree.c 项目: spacefan/LCUI
static RBTreeNode*
rb_insert( RBTree *rbt, int key, const void *keydata, void *data )
{
	RBTreeNode *root, *node, *parent_node;

	parent_node = NULL;
	root = rbt->root;
	node = rb_search_auxiliary( root, key, keydata,
				    rbt->compare, &parent_node );
	if( node ) {
		return NULL;
	}

	node = (RBTreeNode*)malloc( sizeof(RBTreeNode) );
	node->left = NULL;
	node->parent = parent_node;
	node->right = NULL;
	node->data = data;
	node->key = key;
	node->color = RED;

	if( parent_node ) {
		if( rbt->compare && keydata ) {
			if( rbt->compare( parent_node->data, keydata ) > 0 ) {
				parent_node->left = node;
			} else {
				parent_node->right = node;
			}
		} else {
			if( parent_node->key > key ) {
				parent_node->left = node;
			} else {
				parent_node->right = node;
			}
		}
	} else {
		root = node;
	}
	rbt->total_node += 1;
	/* 调整红黑树的平衡 */
	rbt->root = rb_insert_rebalance( root, node );
	return node;
}
示例#6
0
static int
rb_insert( rb_tree_t *rbt, mem_data_t *data, rb_data_type_t type )
{
	rb_node_t *root, *node, *parent_node;
	
	parent_node = NULL;
	root = rbt->root;
	node = rb_search_auxiliary( root, data, type, &parent_node );
	if( node ) {
		return -1;
	}

	node = (rb_node_t*)malloc( sizeof(rb_node_t) );
	node->left = NULL;
	node->parent = parent_node;
	node->right = NULL;
	node->mem_data = *data;
	node->color = RED;

	if( parent_node ) {
		if( type == RB_DATA_TYPE_ADDR ) {
			if( parent_node->mem_data.mem_blk.mem_addr
				> data->mem_blk.mem_addr ) {
				parent_node->left = node;
			} else {
				parent_node->right = node;
			}
		} else {
			if( parent_node->mem_data.mem_info.class_id
				 > data->mem_info.class_id ) {
				parent_node->left = node;
			} else {
				parent_node->right = node;
			}
		}
	} else {
		root = node;
	}
	/* 调整红黑树的平衡 */
	rbt->root = rb_insert_rebalance( root, node );
	return 0;
}  
示例#7
0
文件: rbtree.c 项目: songhowl/devkit
int rb_insert(struct rb_node* node, struct rb_root* root,
              int (*cmp_func)(struct rb_node*, struct rb_node*))
{
    struct rb_node *parent = NULL, **cursor = &root->node;

    while (*cursor) {
        int diff;

        parent = *cursor;
        diff = cmp_func(node, parent);
        if (diff < 0)
            cursor = &parent->left;
        else if (diff > 0)
            cursor = &parent->right;
        else
            return -1;
    }

    rb_link_node(node, parent, cursor);
    rb_insert_rebalance(node, root);

    return 0;
}