Browse Source

完成删除逻辑,还没有测试

Gogs 4 months ago
parent
commit
6a9343b87b
1 changed files with 54 additions and 5 deletions
  1. 54 5
      STL/extend/skiplist.h

+ 54 - 5
STL/extend/skiplist.h

@@ -17,7 +17,7 @@ namespace nanxing_extend
     {
         const char* what() const noexcept
         {
-            return "malloc next_node point fault";
+            return "malloc next_node point falure";
         }
     };
 
@@ -46,7 +46,7 @@ namespace nanxing_extend
     #ifdef SKIP_MAX_SIZE
         too_small,
     #endif
-        fault,
+        falure,
         exit,
         empty,
 
@@ -80,6 +80,10 @@ namespace nanxing_extend
             std::memset(next_node,0,sizeof(skip_node<K,V>*)*level);
         }
         K get_key(){ return key; }
+        ~skip_node()
+        {
+            delete[] this->next_node;              //将申请的next指针存储空间完全释放
+        }
     };
 
     template<typename K,typename V>
@@ -223,8 +227,8 @@ namespace nanxing_extend
             return sk;
         }
 
-        [[nodiscard]]
-        auto Delete_node(K _key)noexcept ->std::variant<Skip_result,V>            //由于V由泛型决定可能是一个指针,因此直接将这个类型返回交由用户自主处理
+        
+        auto Delete_node(K _key) noexcept ->std::variant<Skip_result,V>            //由于使用侵入式数据结构,因此当节点空间析构的时候对应的数据也会完全析构
         {
             std::variant<Skip_result,V> sk;
             if(current_size==0)
@@ -232,6 +236,51 @@ namespace nanxing_extend
                 std:cerr<<"The skiplist is empty"<<std::endl;
                 return sk=Skip_result::empty;
             }
+            else
+            {
+                ptr updata[max_level]={nullptr};          //用于更新的数组
+                ptr point=head[max_level-1];
+                ptr tmp;
+                for(int i=max_level-1;i>=0;i--)
+                {
+                    for(;;)
+                    {
+                        if(point->next_node[i]==nullptr)
+                        {
+                            break;
+                        }
+                        else if(point->next_node[i]->key>=_key)
+                        {
+                            if(point->next_node[i]->key==_key)
+                            {
+                                updata[i]=point;
+                            }
+                            else{
+                                break;
+                            }
+
+                        }
+                        else{
+                            point=point->next_node[i];              //更新point指针
+                        }
+                    }
+                }         
+                if(updata[0]!=nullptr)
+                {
+                    tmp=updata[0]->next_node[0];          //需要被删除的数据结构
+                    int i=0;
+                    while(i<max_level-1&&updata[i]!=0)
+                    {
+                        updata[i]->next_node[i]=tmp->next_node[i];
+                        i++;
+                    }
+                    delete tmp;
+                    sk=Skip_result::successufl;
+                    return sk;
+                }
+            }
+            sk=Skip_result::falure;
+            return sk;
         }
 
         [[nodiscard]]                    
@@ -261,7 +310,7 @@ namespace nanxing_extend
                     }
                 }
             }
-            return sk=Skip_result::fault;
+            return sk=Skip_result::falure;
         }
                 
         void init_skip()                 //直接生成随机数表