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) ); }
//---------- 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); }
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; }