c - Bubble sort double linked list -


hello i'm trying sort double linked list in c using bubble sort algorithm. here code:

struct node {                 unsigned char key;                 unsigned char num;                 struct node *left;                 struct node *right;             }; 

here sort funcion:

void sort(int count, struct node *t_node) {     struct node *tmp,*nextnode, *node1, *node2;      for(node1 = t_node;node1->right != null ;node1 = node1->right) {         for(node2 = node1->right; node2->right != null; node2 = node2->right) {             if(node2->key > node2->right->key)             {                                nextnode = node2->right;                 tmp = node2->left;                 node2->right = nextnode->right;                              node2->left = nextnode->left;                 nextnode->right = node2;                 nextnode->left = tmp;             }         }     }  } 

it works in 80% because example data:

node1 key=3 node2 key=144 node3 key=49 node4 key=207 

the result after sort is:

node1 key=3 node2 key=144 node4 key=207 

why third node disappeared? problem?

it's double-linked list. swap 2 nodes, typically 6 pointers need updated. have a <-> b <-> c <-> d , want swap b , c: you'll need update right of a, b, , c, , left of b, c, , d.

your code updating 4 pointers here:

        if(node2->key > node2->right->key)         {                            nextnode = node2->right;             tmp = node2->left;             node2->right = nextnode->right;                          node2->left = nextnode->left;             nextnode->right = node2;             nextnode->left = tmp;         } 

this shall fix issue:

        if(node2->key > node2->right->key)         {                            nextnode = node2->right;             tmp = node2->left;             if (tmp)                 tmp->right = nextnode;             if (nextnode->right)                 nextnode->right->left = node2;             node2->right = nextnode->right;                          node2->left = nextnode->left;             nextnode->right = node2;             nextnode->left = tmp;         } 

Comments