Пример #1
0
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;
}
Пример #2
0
/////////////////////////////////////////////////////////////
/////////////////////  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;
}