Browse Source

完成查找相关操作,修改部分insert中的错误

Gogs 4 months ago
parent
commit
1ca2956282
2 changed files with 44 additions and 7 deletions
  1. 39 7
      STL/extend/skiplist.h
  2. 5 0
      test.cpp

+ 39 - 7
STL/extend/skiplist.h

@@ -84,6 +84,7 @@ namespace nanxing_extend
         static_assert(nanxing_extend::compare_admit<V>value);
     private:
         using Node=skip_node<K,V>;
+        using ptr=Node*;
         using Nptr=Node**;
         //由于C++的便利性我们考虑使用带头节点的跳表(C++允许对数据不进行初始化(默认构造函数))
         Nptr head;                      //头节点
@@ -138,7 +139,7 @@ namespace nanxing_extend
         [[nodiscard]]                            //这个返回值最好不要忽略否则很有可能会出现内存泄漏
         skiplistre<V> insert(K _key,V _value)              //如果相同的时候我们考虑将value返回因为value很可能会是一个指针,需要手动清空内存
         {
-            using ptr=Node*;
+            
             int rand_level=0;
             ptr updata[max_level]={nullptr};          //用于更新的数组
             int level=current_level-1;
@@ -187,22 +188,53 @@ namespace nanxing_extend
                     new_node=new skip_node(_key,_value,rand_level);
                 }
                 ptr tmp=nullptr;
-                for(int i=0;i<=level;i++)
+                
+                for(int i=0;i<=rand_level;i++)
                 {
                     tmp=updata[i]->next_node[i];
                     updata[i]->next_node[i]=new_node;
                     new_node->next_node[i]=tmp;
                 }
+                if(rand_level>current_level)
+                {
+                    current_level=rand_level;
+                }
+                current_size++;
+                #ifdef SKIP_MAX_SIZE
+                    return sk.result=Skip_result::full;
+                #endif
             }
             sk.Skip_result=Skip_result::successufl;
         }
-        
-        skiplistre<V> search(K _key)
-        {
 
+        [[nodiscard]]                    
+        skiplistre<V> search(K _key) noexcept       //不涉及任何内存分配相关任务,因此是异常安全的
+        {
+            skipList<V> sk;
+            ptr tmp=head[current_level-1];
+            int tmp_level=current_level-1;
+            for(i=tmp_level;i>=0;i--)
+            {
+                while(tmp->next_node[tmp_level]!=nullptr)
+                {
+                    if(tmp->next_node[tmp_level]->key>=_key)
+                    {
+                        if(tmp->next_node[tmp_level]->key==_key)
+                        {
+                            return sk.result=tmp->next_node[tmp_level]->key;
+                        }
+                        else{
+                            break;            //跳出开始下一层循环
+                        }
+                    }
+                    else{
+                        tmp=tmp->next_node[tmp_level];
+                    }
+                }
+            }
+            return sk.result=Skip_result::fault;
         }
-
-
+        
         void init_skip()                 //直接生成随机数表
         {
             try{

+ 5 - 0
test.cpp

@@ -1,4 +1,8 @@
 #include<iostream>
+union stat
+{
+
+};
 int main()
 {
     int a[10]={0};
@@ -10,4 +14,5 @@ int main()
     {
         std::cout<<j<<std::endl;
     }
+
 }