#include <iostream>
#include <climits>
using namespace std;
class skipNode
{
private:
int data;
int height;
skipNode **forward;
public:
skipNode(int d,int h)
{
data = d;
height = h;
forward = new skipNode*[height];
}
// Return max height of skipList Node.
int getHeight()
{
return height;
}
// Set data value of skipList Node.
void setData(int number)
{
data = number;
}
// Return Data value of skipList Node.
int getData()
{
return data;
}
// Set forward[pos] = ptr
void setForwardLink(skipNode *ptr, int pos)
{
forward[pos] = ptr;
}
// Return forward[index]
skipNode* getForwardLink(int index)
{
return forward[index];
}
};
class skipList
{
private:
int maxHeight;
skipNode *head;
skipNode *tail;
// static int count to be used as seed to srand
static int count;
public:
skipList()
{
maxHeight = 5;
head = new skipNode(INT_MIN,maxHeight);
tail = new skipNode(INT_MAX,maxHeight);
for(int i=0; i<maxHeight; i++)
{
head->setForwardLink(tail,i);
tail->setForwardLink(NULL,i);
}
}
// Generate a random number betweem 1 - maxHeight.
int getHeight()
{
count++;
srand(count);
return ((rand() % maxHeight) +1);
}
// Traverse and print all nodes at a level.
void levelTraversal()
{
for(int level = maxHeight-1; level >=0 ; level--)
{
cout<<"nLevel = "<<level;
skipNode *next = head->getForwardLink(level);
while(next != tail )
{
cout<<"t"<<next->getData();
next = next->getForwardLink(level);
}
}
}
void insertNode(int val)
{
// Check if already Present.
if(searchNode(val))
{
return;
}
// If not get Random height for New Node.
int h = getHeight();
skipNode *newNode = new skipNode(val,h);
// Need to update nodes forward pointer to point to new node.
skipNode *curNode = head;
for(int i=h-1; i>=0; i--)
{
while(curNode->getForwardLink(i) != tail && curNode->getForwardLink(i)->getData() < val)
{
curNode = curNode->getForwardLink(i);
}
// curNode represents node at level i whose forward[i] = new Node .
// copy newNode.forward[i] = curNode.forward[i]
newNode->setForwardLink(curNode->getForwardLink(i),i);
curNode->setForwardLink(newNode,i);
}
}
// Search value if present return node else return NULL.
skipNode* searchNode(int val)
{
// Start from head Node and search at topMost level.
skipNode *ptr = head;
for(int level = maxHeight-1; level >=0; level--)
{
skipNode *nextNode = ptr->getForwardLink(level);
// Narrow down search from ptr to tail or node having value >= val
while(nextNode->getData() < val && nextNode != tail)
{
ptr = nextNode;
nextNode = nextNode->getForwardLink(level);
}
if(nextNode->getData() == val)
return nextNode;
}
return NULL;
}
void deleteNode(int val)
{
// check if node exist
skipNode *toDelete = searchNode(val);
if(toDelete)
{
// Get height of node to be deleted.
int level = toDelete->getHeight();
// forward pointer of nodes just before delete node neeeds updation of forward pointer.
skipNode *curNode = head;
for(int i=level-1; i>=0; i--)
{
while(curNode->getForwardLink(i) != toDelete)
{
curNode = curNode->getForwardLink(i);
}
curNode->setForwardLink(toDelete->getForwardLink(i),i);
}
}
else
{
return;
}
}
void displaySkipList()
{
for(int level = maxHeight-1; level >=0; level--)
{
cout<<"n";
skipNode* ptr = head;
while(ptr != tail)
{
cout<<" "<<ptr->getData();
ptr = ptr->getForwardLink(level);
}
}
}
};
int skipList::count = 0;
int main()
{
skipList list ;
list.insertNode(10);
list.insertNode(20);
list.insertNode(40);
list.insertNode(50);
list.insertNode(60);
list.insertNode(70);
list.insertNode(30);
list.levelTraversal();
list.deleteNode(40);
cout<<"nnAFTER DELETION";
list.levelTraversal();
system("pause");
}
Sunday, 16 June 2013
Implementation of SkipList Datastructure.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment