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