cpp#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstring>
const int MAX_LEVEL = 6; // 最大层数
// 跳表节点模板
template<typename K, typename V>
struct SkipListNode {
K key;
V value;
SkipListNode<K, V>** forward;
SkipListNode(int level, const K& k, const V& v)
: key(k), value(v) {
forward = new SkipListNode<K, V>*[level + 1];
memset(forward, 0, sizeof(SkipListNode<K, V>*) * (level + 1));
}
~SkipListNode() {
delete[] forward;
}
};
// 跳表模板
template<typename K, typename V>
class SkipList {
public:
SkipList() {
head = new SkipListNode<K, V>(MAX_LEVEL, K(), V());
level = 0;
srand(time(NULL)); // 初始化随机数种子
}
~SkipList() {
SkipListNode<K, V>* p = head;
while (p) {
SkipListNode<K, V>* q = p;
p = p->forward[0];
delete q;
}
}
// 查找键值对应的节点
SkipListNode<K, V>* find(const K& key) const {
SkipListNode<K, V>* p = head;
for (int i = level; i >= 0; --i) {
while (p->forward[i] && p->forward[i]->key < key) {
p = p->forward[i];
}
}
p = p->forward[0];
if (p && p->key == key) {
return p;
} else {
return nullptr;
}
}
// 插入键值对
void insert(const K& key, const V& value) {
SkipListNode<K, V>* update[MAX_LEVEL + 1];
memset(update, 0, sizeof(SkipListNode<K, V>*) * (MAX_LEVEL + 1));
SkipListNode<K, V>* p = head;
for (int i = level; i >= 0; --i) {
while (p->forward[i] && p->forward[i]->key < key) {
p = p->forward[i];
}
update[i] = p;
}
p = p->forward[0];
if (p && p->key == key) {
p->value = value; // 键已存在,更新值
} else {
int newLevel = randomLevel();
if (newLevel > level) {
for (int i = level + 1; i <= newLevel; ++i) {
update[i] = head;
}
level = newLevel;
}
SkipListNode<K, V>* newNode = new SkipListNode<K, V>(newLevel, key, value);
for (int i = 0; i <= newLevel; ++i) {
newNode->forward[i] = update[i]->forward[i];
update[i]->forward[i] = newNode;
}
}
}
// 删除键值对应的节点
void remove(const K& key) {
SkipListNode<K, V>* update[MAX_LEVEL + 1];
memset(update, 0, sizeof(SkipListNode<K, V>*) * (MAX_LEVEL + 1));
SkipListNode<K, V>* p = head;
for (int i = level; i >= 0; --i) {
while (p->forward[i] && p->forward[i]->key < key) {
p = p->forward[i];
}
update[i] = p;
}
p = p->forward[0];
if (p && p->key == key) {
for (int i = 0; i <= level; ++i) {
if (update[i]->forward[i] != p) {
break;
}
update[i]->forward[i] = p->forward[i];
}
delete p;
while (level > 0 && head->forward[level] == nullptr) {
--level;
}
}
}
private:
SkipListNode<K, V>* head; // 头节点
int level; // 当前最大层数
// 随机生成节点的层数
int randomLevel() const {
int newLevel = 0;
while (rand() % 2 == 0 && newLevel < MAX_LEVEL) {
++newLevel;
}
return newLevel;
}
};
// 示例使用
int main() {
SkipList<int, std::string> skipList;
// 插入键值对
skipList.insert(1, "One");
skipList.insert(2, "Two");
skipList.insert(3, "Three");
skipList.insert(4, "Four");
skipList.insert(5, "Five");
// 查找键值对应的节点
SkipListNode<int, std::string>* node = skipList.find(3);
if (node) {
std::cout << "Value of key 3: " << node->value << std::endl;
} else {
std::cout << "Key 3 not found." << std::endl;
}
// 删除键值对应的节点
skipList.remove(4);
// 再次查找删除的节点
node = skipList.find(4);
if (node) {
std::cout << "Value of key 4: " << node->value << std::endl;
} else {
std::cout << "Key 4 not found." << std::endl;
}
return 0;
}
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!