using
System;
public
class
Node {
public
int
key;
public
Node[] forward;
public
Node(
int
key,
int
level)
{
this
.key = key;
forward =
new
Node[level + 1];
Array.Clear(forward, 0, level + 1);
}
}
public
class
SkipList {
int
MAXLVL;
float
P;
int
level;
Node header;
public
SkipList(
int
MAXLVL,
float
P)
{
this
.MAXLVL = MAXLVL;
this
.P = P;
level = 0;
header =
new
Node(-1, MAXLVL);
}
int
RandomLevel()
{
float
r = (
float
)
new
Random().Next() /
int
.MaxValue;
int
lvl = 0;
while
(r < P && lvl < MAXLVL) {
lvl++;
r = (
float
)
new
Random().Next() /
int
.MaxValue;
}
return
lvl;
}
Node CreateNode(
int
key,
int
level)
{
Node n =
new
Node(key, level);
return
n;
}
public
void
InsertElement(
int
key)
{
Node current = header;
Node[] update =
new
Node[MAXLVL + 1];
Array.Clear(update, 0, MAXLVL + 1);
for
(
int
i = level; i >= 0; i--) {
while
(current.forward[i] !=
null
&& current.forward[i].key < key)
current = current.forward[i];
update[i] = current;
}
current = current.forward[0];
if
(current ==
null
|| current.key != key) {
int
rlevel = RandomLevel();
if
(rlevel > level) {
for
(
int
i = level + 1; i < rlevel + 1; i++)
update[i] = header;
level = rlevel;
}
Node n = CreateNode(key, rlevel);
for
(
int
i = 0; i <= rlevel; i++) {
n.forward[i] = update[i].forward[i];
update[i].forward[i] = n;
}
Console.WriteLine(
"Successfully Inserted key "
+ key);
}
}
public
void
DisplayList()
{
Console.WriteLine(
"\n*****Skip List*****"
);
for
(
int
i = 0; i <= level; i++) {
Node node = header.forward[i];
Console.Write(
"Level "
+ i +
": "
);
while
(node !=
null
) {
Console.Write(node.key +
" "
);
node = node.forward[i];
}
Console.WriteLine();
}
}
public
static
void
Main(
string
[] args)
{
Random r =
new
Random(Guid.NewGuid().GetHashCode());
SkipList lst =
new
SkipList(3, 0.5f);
lst.InsertElement(3);
lst.InsertElement(6);
lst.InsertElement(7);
lst.InsertElement(9);
lst.InsertElement(12);
lst.InsertElement(19);
lst.InsertElement(17);
lst.InsertElement(26);
lst.InsertElement(21);
lst.InsertElement(25);
lst.DisplayList();
}
}