|
@@ -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() //直接生成随机数表
|