Sortowanie listy dwukierunkowej
Ostatnio zmodyfikowano 2015-06-09 23:09
zolax Temat założony przez niniejszego użytkownika  | 
Sortowanie listy dwukierunkowej » 2015-06-09 14:33:54 Witam wszystkich mam problem z posortowaniem listy dwukierunkowej za pomocą sortowania bąbelkowego. Mój kod wygląda tak: struct node {     int key;     struct node * left;     struct node * right; };
  void sort( int count, struct node * t_node ) {     struct node * tmp, * nextnode, * node1, * node2;     node2 = t_node;          do {         while( node2->right ) {             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;              }             node2 = node2->right;         }         count = count - 1;     } while( count > 1 );           }
  Problem polega na tym, że dla przykładowych danych przed sortowaniem mam Node value: 15 Node value: 3 Node value: 1 Node value: 10 A po sortowaniu: Node value: 15 Node value: 1 Node value: 10
  Może ktoś pomóc?   | 
 | 
pekfos  | 
» 2015-06-09 19:40:13 Zdefiniuj sobie funkcję zamieniającą 2 elementy listy ze sobą i uwzględnij wszystkie przypadki. Cała reszta jest wtedy banalna.  | 
 | 
zolax Temat założony przez niniejszego użytkownika  | 
» 2015-06-09 23:01:12 Utworzyłem taką funkcję: void swapNodes( struct node * i, struct node * j ) {     if( i->left ) i->left->right = j;          if( j->left ) j->left->right = i;          if( i->right ) i->right->left = j;          if( j->right ) j->right->left = i;          struct node * temp;     temp = i->left;     i->left = j->left;     j->left = temp;     temp = i->right;     i->right = j->right;     j->right = temp; } Jednak teraz zamienia mi tylko 2 element z 3. Co robię źle?  | 
 | 
pekfos  | 
» 2015-06-09 23:09:49 Twój sposób nie uwzględnia przypadku, gdy 2 węzły sąsiadują ze sobą. Nie aktualizujesz też wskaźnika na pierwszy element listy.  | 
 | 
|  « 1 »  |