//跳跃表的插入操作
template<class Key,class Elem,class KEComp,class EEComp>
bool SkipList<Key,Elem,KEComp,EEComp>::
insert(const Elem& val) {
int i;
SkipNode<Elem> *x= head; //从头结点开始
int newLevel = randomLevel(); //选择一个新级数
if(newLevel>level) { //如果是最深的一级
AdjustHead(newLevel); //往头结点加入空指针,表示新增一级
level = newLevel; 更新头结点的级数
}
SkipNode<Elem>* update[level+1]; //声明一个数组,存放0到level共level+1个结点,该数组存放每一级到达的最远结点
for(i=level;i>=0;i--) {
while((x->forward[i]!=null)&&EEComp::lt(x->forward[i]->value,val))
x = x->forward[i];
update[i] = x; //当走到终点前,更新update[i]的值
}
x = new SkipNode<Elem> (val,newLevel); //生成要插入的新结点
for(i=0;i<=newLevel;i++) {
x->forward[i] = update[i]->forward[i]; //将新结点的下一个位置指针设定为原本最远结点的下一个位置
update[i]->forward[i] = x; //将原本最远结点的下一位置设为x
}
reccount++;
}