Beispiel #1
0
void remove_all(struct hash *hash, struct node *n)
{
    struct tree *t;
    struct tree_node *h, *s;

    if (n->neededby->root || n->providedby->root)
        return;

    h = tree_first(n->provide->root);

    while (h) {
        s = tree_search_tree_node(h->n->providedby, n);
        tree_node_free(h->n->providedby, s);
        remove_all(hash, h->n);
        h = tree_next(h);
    }

    h = tree_first(n->need->root);

    while (h) {
        s = tree_search_tree_node(h->n->neededby, n);
        tree_node_free(h->n->neededby, s);
        remove_all(hash, h->n);
        h = tree_next(h);
    }

    t = hash->tbl[hash_index(n->name)];
    s = tree_search_tree_node(t, n);
    tree_node_free(t, s);

    node_free(n);
}
Beispiel #2
0
static void
tree_node_free(tree* tree, tree_node* node)
{
    ASSERT(node != NULL);

    tree_node* llink = node->llink;
    tree_node* rlink = node->rlink;
    if (tree->del_func)
	tree->del_func(node->key, node->datum);
    FREE(node);
    if (llink)
	tree_node_free(tree, llink);
    if (rlink)
	tree_node_free(tree, rlink);
}
Beispiel #3
0
void tree_node_free(struct tree_node * tn)
{
    unsigned i;

    if (tn->head) {
        free(tn->head);
        tn->head = NULL;
    }

    if (tn->value) {
        free(tn->value);
        tn->value = NULL;
    }

    for (i = 0; i < tn->node_count; i++) {
        struct tree_node * tn2 = tn->nodes[i];

        tn->nodes[i] = NULL;

        if (tn2) {
            tree_node_free(tn2);
        }
    }

    if (tn->nodes) {
        free(tn->nodes);
        tn->nodes = NULL;
    }

    return;
}
Beispiel #4
0
void _bin_tree_flush (TreeNode *n, TreeNode *sent)
{
	if (n != sent)
	{
		_bin_tree_flush (tree_node_get_left (n), sent);
		_bin_tree_flush (tree_node_get_right (n), sent);
		tree_node_free (n);
	}
}
Beispiel #5
0
size_t
tree_clear(void* Tree)
{
    ASSERT(Tree != NULL);

    tree* tree = Tree;
    const size_t count = tree->count;
    if (tree->root) {
	tree_node_free(tree, tree->root);
	tree->root = NULL;
	tree->count = 0;
    }
    return count;
}
Beispiel #6
0
void *rb_tree_delete (RbTree *t, void *data)
{
	TreeNode *x;	/* y's not SENTINEL child, or SENTINEL if y don't have child */
	TreeNode *y;	/* the node actually delete */
	TreeNode *z;	/* the node contain data */
	TreeNode *py;	/* parent of y */

	assert (t != NULL);

	z = _bin_tree_search (tree_node_get_right (t->sent), t->sent, t->cmp_f, data);
	if (z == NULL)
	{
		fprintf (stderr, "warning!, return an NULL\n");
		return NULL;
	}

	if ((tree_node_get_left (z) == t->sent) || (tree_node_get_right (z) == t->sent))
	{
		y = z;
	}
	else
	{
		y = _bin_tree_successor (z, t->sent);
	}

	if (tree_node_get_left (y) != t->sent)
	{
		x = tree_node_get_left (y);
	}
	else
	{
		x = tree_node_get_right (y);
	}

	py = tree_node_get_parent (y);
	tree_node_set_parent (x, py);

	if (py == t->sent)
	{
		tree_node_set_right (t->sent, x);
	}
	else
	{
		if (y == tree_node_get_left (py))
		{
			tree_node_set_left (py, x);
		}
		else
		{
			tree_node_set_right (py, x);
		}
	}

	if (y != z)
	{
		tree_node_set_content (z, tree_node_get_content (y));
	}

	if (tree_node_is_black (y))
	{
		rb_delete_fixup (t, x);
	}

	tree_node_free (y);
	(t->card)--;

	return data;
}