Пример #1
0
int map_insert(map * m, void *key, void *value)
{
	map_node *p = m->root.left, *q;
	int cr;
	if (!p) {
		m->root.left = map_node_new(key, value, &(m->root));
		return 1;
	}
	while ((cr = m->comp_fn(key, p->key))) {
		if (cr > 0) {
			if (!p->right) {
				q = map_node_new(key, value, p);
				p->right = q;
				if (++p->balance)
					goto do_balance;
				return 1;
			}
			p = p->right;
		} else {
			if (!p->left) {
				q = map_node_new(key, value, p);
				p->left = q;
				if (--p->balance)
					goto do_balance;
				return 1;
			}
			p = p->left;
		}
	}
	return 0;
do_balance:
	do {
		q = p->parent;
		if (!q->parent)
			return 1;
		if (q->left == p) {
			q->balance--;
			if (q->balance < -2)
				MAP_BUG();
			if (q->balance == -2) {
				if (map_do_balance(q))
					break;
				MAP_BUG();
			}
		} else {
			q->balance++;
			if (q->balance > 2)
				MAP_BUG();
			if (q->balance == 2) {
				if (map_do_balance(q))
					break;
				MAP_BUG();
			}
		}
		p = q;
	} while (q->balance);
	return 1;
}
Пример #2
0
void map_insert(map_t * handle, void * key, void * val)
{
	binomial_tree_node_t * curr;
	map_node_t * cval;
	map_node_t * node = map_node_new(key, val);
	int rc;

	curr = binomial_tree_get_root(handle->tree);
	while (1)
	{
		cval = (map_node_t*)binomial_tree_node_get_value(curr);
		if (cval == NULL)
		{
			if (binomial_tree_node_set_value(curr, cval, node) == 0)
			{
				binomial_tree_node_release(curr);
				break;
			}
			continue;
		}
		if (cval->flag)
		{
			curr = binomial_tree_node_get_right(curr);
			continue;
		}
		rc = handle->cmp_func(node->key, cval->key);
		if (rc < 0)
		{
			curr = binomial_tree_node_get_left(curr);
		}
		else if (rc > 0)
		{
			curr = binomial_tree_node_get_right(curr);
		}
		else
		{
			if (binomial_tree_node_set_value(curr, cval, node) == 0)
			{
				binomial_tree_node_release(curr);
				break;
			}
		}
	}
}