Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sortowanie listy dwukierunkowej

Ostatnio zmodyfikowano 2015-06-09 23:09
Autor Wiadomość
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:
C/C++
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 ) {
                // zamiana B z C w liście A<->B<->C<->D na listę A<->C<->B<->D
                // B = node2
                nextnode = node2->right; // C
                tmp = node2->left; // A
               
                if( tmp )
                     tmp->right = nextnode; // A->right = C
               
                if( nextnode->right )
                     nextnode->right->left = node2; //D->left = B
               
                node2->right = nextnode->right; //B->right = D
                node2->left = nextnode->left; //B->left = C
                nextnode->right = node2; //C->right = B
                nextnode->left = tmp; //C->left = A
            }
            node2 = node2->right;
        }
        count = count - 1;
    } while( count > 1 );
   
   
}

Problem polega na tym, że dla przykładowych danych przed sortowaniem mam
C/C++
Node value: 15
Node value: 3
Node value: 1
Node value: 10
A po sortowaniu:
C/C++
Node value: 15
Node value: 1
Node value: 10
Może ktoś pomóc?
P-133371
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.
P-133390
zolax
Temat założony przez niniejszego użytkownika
» 2015-06-09 23:01:12
Utworzyłem taką funkcję:
C/C++
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?
P-133409
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.
P-133410
« 1 »
  Strona 1 z 1