int SkipList::add(const Key& key, bool verbose) { if (find(key, false) != 0) { if (verbose) { cout<<"Node "<<key<<" is already in the list."<<endl; } return 0; } SkipListNode* newNode = new SkipListNode(key, randHeight()); if (verbose) { cout<<"Add new node "<<*newNode<<" with height "<<newNode->height()<<endl; } int ret = add (m_head, newNode, m_maxHeight-1); if (ret == 0 ) { return ret; } return 1; }
///////////////////////////////////////////////////////////// ///////////////////// DEL FUNCTION //////////////////////// ///////////////////////////////////////////////////////////// SkipListNode* SkipList::del(SkipListNode* target, const Key& key, unsigned level) { if (target->nextAtLevel(level) != NULL && *target->nextAtLevel(level) < key) { countDelete++; } ////////////// Write your code below //////////////////////// // deleting from an empty skip list returns null if (target == NULL) return NULL; SkipListNode * t = target->nextAtLevel(level); // if hits the end of the current level, goes down the level if (t == NULL) { // if level is already 0, key is not found if (level == 0) return NULL; return del(target, key, level-1); } // node is found if (*t == key) { target->setNextAtLevel(level, t->nextAtLevel(level)); if (level == 0) return t; // if level is > 0, recurssively delete its corresponding node at lower levels return del(target, key, level-1); } // if the key is smaller than the node, means it can't be located after the node // go down the level to find it if (key < *t) { return del(target, key, level-1); } // if the key is larger than the node, keep checking in the same level return del(t, key, level); }
void SkipList::dump(char sep) { int length = -1; cout << "Current List: "; for (SkipListNode* iter = m_head; iter != NULL; iter = iter->nextAtLevel(0)) { length++; cout << string(*iter) << " "; cout << "(" << iter->height() << ":"; for (unsigned i = 0; i < iter->height(); i++) { if (iter->nextAtLevel(i)) { cout << " "<< i << ":" << *(iter->nextAtLevel(i)); cout.flush(); } } cout << ")" << sep; } cout << length << " nodes in total." << endl; }