Use a double linked list. These are infinitely easier to work with than single linked lists.
Code:
struct node
{
struct node *prev, *next;
...other data here...
};
Make one node which is your root node. I always use a global (most always anyway) simply because it is so much easier to work with this way.
From there:
Code:
if( node->prev->key > node->key )
{
node->prev->next = node->next;
node->next = node->prev;
if( node->prev->prev )
{
node->prev->prev->next = node;
node->prev = node->prev->prev;
}
}
It may be complicated looking, but draw it out on paper, it's very simple.
[n1]<->[n2]<->[n3]<->[n4]
That is how a double linked list works.
Quzah.