/*C arrays are indexed starting at 0. */ void init_skipset(skipset** ss ) { *ss = malloc(sizeof(skipset)); (*ss)->item = NULL; (*ss)->level = 0; int i = HEADER; (*ss)->header = make_skipnode((*ss), MAX_LEVEL, &i, sizeof(int)); }
skiplist make_skiplist(size_t data_sz) { skiplist s; s.head = make_skipnode(-1L, SKIPLIST_MAX_LEVEL, 0); s.data_sz = data_sz; return s; }
void insert(skiplist sk, unsigned long key, void* data, RNG* rng) { int insertion_level = nodeLevel(rng); skipnode* new_node = make_skipnode(key, insertion_level, sk.data_sz); memcpy(data, ((char*) new_node - sk.data_sz), sk.data_sz); insert_node(sk.head, new_node, insertion_level); }
/*an array of pointers to the nodes that must be updated. */ void insert_skipnode(skipset* ss, const void* key, int key_sz, int (*compare_keys)(const void* key1, const void* key2)) { if(contains_skipnode(ss, key, compare_keys) != NULL) /*no duplicates allowed in set*/ return; int l = random_level(); /*level of new node*/ if(l > ss->level) ss->level = l; insert_node(ss->header, make_skipnode(ss, l, key, key_sz), l, compare_keys); }