Listing 5: Skiplist insertion function


template <class DATA, class KEY>
int Skiplist<DATA,KEY>::rand_level()
{
  int level = 1;
  while ( rand() % 4 == 0 && level < SLMAX_LEVEL )
  {
     level++;
  }
  return( level );
}

template <class DATA, class KEY>
void Skiplist<DATA,KEY>::insert( DATA *data,
const KEY &key )
{
    SLPosition<DATA,KEY> *update[SLMAX_LEVEL];
    SLPosition<DATA,KEY> *cur = &head;
    SLPosition<DATA,KEY> *new_pos;
    int pos_level;
    int i;

    for( i = level-1; i >= 0; i-- )
    {
        while( cur->forward[i] != NULL &&
          cur->forward[i]->key < key )
        {
            cur = cur->forward[i];
        }
        update[i] = cur;
    }
    pos_level = rand_level();
    new_pos = new SLPosition<DATA,KEY>( pos_level, data, key );
    if( pos_level > level )
    {
        for( i = level; i < pos_level; i++ )
        {
            update[i] = &head;
        }
        level = pos_level;
    }
    for( i = 0; i < pos_level; i++ )
    {
        new_pos->forward[i] = update[i]->forward[i];
        update[i]->forward[i] = new_pos;
    }
}