C'è un bug nella funzione SwapNode.
Per eliminarlo bisogna aggiungere la seguente istruzione in cima alla funzione ( sia nella versione 'Simple List' che in 'Double List' ) :
Questo è il codice completo della funzione per la versione 'Simple List' :codice:if ( node1 == node2 ) return first;
e questo è quello per la versione 'Double List' :codice:Persona *SwapNodes(Persona *node1, Persona *node2, Persona *first) { if ( node1 == node2 ) return first; Persona *node1prev, *node2prev, *tmp; node1prev = FindPrev(node1, first); node2prev = FindPrev(node2, first); tmp = node2->next; // Se l'elementop è iol primo della lista if (node1 != first) { node1prev->next = node2; } else { first = node2; } // Sono due elementi adiacenti? if (node1->next == node2) { node2->next = node1; node1->next = tmp; } else { node2->next = node1->next; node1->next = tmp; node2prev->next = node1; } return first; }
codice:Persona *SwapNodes(Persona *node1, Persona *node2, Persona *first) { if ( node1 == node2 ) return first; Persona *node1prev, *node2prev, *tmp, *tmp2; node1prev = node1->prev; node2prev = node2->prev; tmp = node2->next; tmp2 = node1->next; if (node1 != first) { node1prev->next = node2; } else { first = node2; } // Sono due nodi adiacenti? if (node1->next == node2) { // I nodi sono adiacenti node2->next = node1; node1->next = tmp; node2->prev = node1prev; node1->prev = node2; if ( node1->next ) tmp->prev = node1; } else { // I nodi non sono adiacenti node2->next = node1->next; node1->next = tmp; node2->prev = node1prev; node1->prev = node2prev; node2prev->next = node1; node2prev->prev = tmp2; if ( node1->next ) tmp->prev = node1; tmp2->prev = node2; } return first; }

