Пример #1
0
int deleted(Skiplist *skiplist, DataType data, int (*compare)(DataType v1, DataType v2))
{
    if(NULL == skiplist)
    {
        return 0;
    }
    Node *next = NULL;
    Node *cur = skiplist->head;

    Node *updates[MAX_LEVEL] = {NULL};
    for(int i = skiplist->level - 1; i >= 0; --i)
    {
        while((next = cur->nexts[i]) && compare(data, next->data) > 0)
        {
            cur = next;
        }
        updates[i] = cur;
    }
    if(NULL != next && compare(data, next->data) != 0)
    {
        return 0;
    }
    for(int i = skiplist->level - 1; i >= 0; --i)
    {
        if(updates[i]->nexts[i] == next)
        {
            updates[i]->nexts[i] = next->nexts[i];
            if(NULL == skiplist->head->nexts[i])
            {
                skiplist->level--;
            }
        }
    }
    return destroynode(&next);
}
Пример #2
0
static void
detachnode(dns_db_t *db, dns_dbnode_t **nodep) {
	dns_ecdb_t *ecdb = (dns_ecdb_t *)db;
	dns_ecdbnode_t *node;
	isc_boolean_t need_destroy = ISC_FALSE;

	REQUIRE(VALID_ECDB(ecdb));
	REQUIRE(nodep != NULL);
	node = (dns_ecdbnode_t *)*nodep;
	REQUIRE(VALID_ECDBNODE(node));

	UNUSED(ecdb);		/* in case REQUIRE() is empty */

	LOCK(&node->lock);
	INSIST(node->references > 0);
	node->references--;
	if (node->references == 0)
		need_destroy = ISC_TRUE;
	UNLOCK(&node->lock);

	if (need_destroy)
		destroynode(node);

	*nodep = NULL;
}
Пример #3
0
void destroy(Skiplist **skiplist)
{
    if(NULL == *skiplist)
    {
        return;
    }
    Node *node = NULL;
    while(NULL != (node = (*skiplist)->head))
    {
        (*skiplist)->head = node->nexts[0];
        destroynode(&node);
    }
    free(*skiplist);
    *skiplist = NULL;
}