Advertisement
YaBoiSwayZ

SkipList

May 26th, 2024
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.18 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <climits>
  3. #include <cstdlib>
  4.  
  5. class Node {
  6. public:
  7.     int key;
  8.     Node **forward;
  9.     Node(int, int);
  10. };
  11.  
  12. Node::Node(int key, int level) {
  13.     this->key = key;
  14.     this->forward = new Node*[level+1];
  15.     for (int i = 0; i <= level; i++) {
  16.         forward[i] = nullptr;
  17.     }
  18. }
  19.  
  20. class SkipList {
  21.     int maxLevel;
  22.     int level;
  23.     Node *header;
  24. public:
  25.     SkipList(int);
  26.     ~SkipList();
  27.     int randomLevel();
  28.     Node* createNode(int, int);
  29.     void insertElement(int);
  30.     bool searchElement(int);
  31.     void deleteElement(int);
  32.     void displayList();
  33. };
  34.  
  35. SkipList::SkipList(int maxLevel) {
  36.     this->maxLevel = maxLevel;
  37.     this->level = 0;
  38.     this->header = new Node(INT_MIN, maxLevel);
  39. }
  40.  
  41. SkipList::~SkipList() {
  42.     Node* current = header;
  43.     while(current != nullptr) {
  44.         Node* next = current->forward[0];
  45.         delete current;
  46.         current = next;
  47.     }
  48. }
  49.  
  50. int SkipList::randomLevel() {
  51.     int lvl = 0;
  52.     while (rand() % 2 && lvl < maxLevel) {
  53.         lvl++;
  54.     }
  55.     return lvl;
  56. }
  57.  
  58. Node* SkipList::createNode(int key, int level) {
  59.     Node* n = new Node(key, level);
  60.     return n;
  61. }
  62.  
  63. void SkipList::insertElement(int key) {
  64.     Node* current = header;
  65.     Node* update[maxLevel+1];
  66.     memset(update, 0, sizeof(Node*) * (maxLevel + 1));
  67.  
  68.     for (int i = level; i >= 0; i--) {
  69.         while (current->forward[i] != nullptr && current->forward[i]->key < key) {
  70.             current = current->forward[i];
  71.         }
  72.         update[i] = current;
  73.     }
  74.     current = current->forward[0];
  75.  
  76.     if (current == nullptr || current->key != key) {
  77.         int rlevel = randomLevel();
  78.  
  79.         if (rlevel > level) {
  80.             for (int i = level + 1; i <= rlevel; i++) {
  81.                 update[i] = header;
  82.             }
  83.             level = rlevel;
  84.         }
  85.  
  86.         Node* n = createNode(key, rlevel);
  87.  
  88.         for (int i = 0; i <= rlevel; i++) {
  89.             n->forward[i] = update[i]->forward[i];
  90.             update[i]->forward[i] = n;
  91.         }
  92.         std::cout << "Successfully inserted key " << key << std::endl;
  93.     }
  94. }
  95.  
  96. bool SkipList::searchElement(int key) {
  97.     Node* current = header;
  98.     for (int i = level; i >= 0; i--) {
  99.         while (current->forward[i] && current->forward[i]->key < key) {
  100.             current = current->forward[i];
  101.         }
  102.     }
  103.     current = current->forward[0];
  104.     if (current && current->key == key) {
  105.         std::cout << "Found key: " << key << std::endl;
  106.         return true;
  107.     }
  108.     std::cout << "Key not found: " << key << std::endl;
  109.     return false;
  110. }
  111.  
  112. void SkipList::deleteElement(int key) {
  113.     Node* current = header;
  114.     Node* update[maxLevel+1];
  115.     memset(update, 0, sizeof(Node*) * (maxLevel + 1));
  116.  
  117.     for (int i = level; i >= 0; i--) {
  118.         while (current->forward[i] != nullptr && current->forward[i]->key < key) {
  119.             current = current->forward[i];
  120.         }
  121.         update[i] = current;
  122.     }
  123.  
  124.     current = current->forward[0];
  125.     if (current != nullptr && current->key == key) {
  126.         for (int i = 0; i <= level; i++) {
  127.             if (update[i]->forward[i] != current) break;
  128.             update[i]->forward[i] = current->forward[i];
  129.         }
  130.  
  131.         while (level > 0 && header->forward[level] == nullptr) {
  132.             level--;
  133.         }
  134.         std::cout << "Successfully deleted key " << key << std::endl;
  135.         delete current;
  136.     }
  137. }
  138.  
  139. void SkipList::displayList() {
  140.     std::cout << "\n*****Skip List*****"<<"\n";
  141.     for (int i = 0; i <= level; i++) {
  142.         Node *node = this->header->forward[i];
  143.         std::cout << "Level " << i << ": ";
  144.         while (node != nullptr) {
  145.             std::cout << node->key << " ";
  146.             node = node->forward[i];
  147.         }
  148.         std::cout << std::endl;
  149.     }
  150. }
  151.  
  152. int main() {
  153.     srand((unsigned)time(0));
  154.     SkipList lst(10);
  155.  
  156.     lst.insertElement(3);
  157.     lst.insertElement(6);
  158.     lst.insertElement(7);
  159.     lst.insertElement(9);
  160.     lst.insertElement(12);
  161.     lst.insertElement(19);
  162.     lst.insertElement(17);
  163.  
  164.     lst.displayList();
  165.  
  166.     lst.searchElement(6);
  167.     lst.deleteElement(6);
  168.     lst.displayList();
  169.  
  170.     return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement