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' ) :

codice:
if ( node1 == node2 )
	return first;
Questo è il codice completo della funzione per la versione 'Simple 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;
}
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, *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;
}