Ejemplo n.º 1
0
static void ky_rbtree_add_i(ky_rbtree_t *rbtree, void *key, ky_rbtree_key_len_t keyLen, void *value, ky_rbtree_value_len_t valueLen)
{
	ky_rbtree_comparefun_t cmpFun = rbtree->cmp_fun;
	ky_rbnode_s *p; 
	ky_rbnode_s *x;
	ky_rbnode_s *node;
	int cmpResult;

	node = ky_rbtree_node_new_i(key, keyLen, value, valueLen);
	if ( rbtree->tree == ky_rbtree_nil )
	{
		node->color = KY_RBTREE_BLACK;
		rbtree->tree = node;
		return;
	}

	p = ky_rbtree_nil;
	x = rbtree->tree;
	while ( x != ky_rbtree_nil )
	{
		p = x;
		cmpResult = cmpFun(x->key, key);
		if ( cmpResult > 0 )
		{
			x = x->left;
		}
		else if ( cmpResult < 0 )
		{
			x = x->right;
		}
		else
		{
			// 如果插入的key, 已经存在, 则删除新建的结点
			ky_rbtree_node_delete_i( node );
			return;
		}
	}

	node->parent = p;
	cmpResult = cmpFun( p->key, key );
	if ( cmpResult > 0 )
	{
		p->left = node;
	}
	else
	{
		p->right = node;
	}
	ky_rbtree_add_rebalance_i( node, &(rbtree->tree) );
}
Ejemplo n.º 2
0
//---------- Begin of function DynArray::bubble_sort -------------//
//!
//! Perform a bubble sort on the array.
//!
//! int(*fcmp)(const void*, const void*) cmpFun = the pointer to the comparsion function
//!
void DynArray::bubble_sort( int(*cmpFun)(const void*, const void*) ) {
    char *tmp;
    tmp=mem_add(ele_size);

    for(int i=0;i<last_ele;i++)
	for(int j=i+1;j<last_ele;j++) {
	    void *p,*q;                                   //swapping
	    p=get(i+1);
	    q=get(j+1);
	    if(cmpFun(p,q)>0) {
		memcpy(tmp,p,ele_size);
		memcpy(p,q,ele_size);
		memcpy(q,tmp,ele_size);
	    }
	}
    mem_del(tmp);
}
Ejemplo n.º 3
0
static ky_rbnode_s *ky_rbtree_find_i(ky_rbtree_s *root, void *key, ky_rbtree_comparefun_t cmpFun)
{
	int cmpResult;

	while ( root != ky_rbtree_nil && (cmpResult = cmpFun(root->key, key)) != 0 )
	{
		if ( cmpResult > 0 )
		{
			root = root->left;
		}
		else if ( cmpResult < 0 )
		{
			root = root->right;
		}
	}

	return root;
}