Alcune considerazioni:
- tutta la parte relativa alla dichiarazione della struct e ai typedef la trovo molto incasinata;
- mi sembra di capire che la funzione concatenate() partendo da l1 concatena le 2 liste alternando un elemento da una lista e un elemento dall'altra.
Una curiosità... a cosa serve quest'alternanza? Non sarebbe più semplice concatenare l'ultimo elemento di una lista al primo dell'altra?!
Al termine della funzione l1 punterà alla testa della lista risultante e l2 punterà al secondo elemento (a tal proposito visto che l2 non rappresenta ormai nulla gli assegnerei il valore NULL). Deduco quindi che l'intento è quello di tenere traccia della nuova lista attraverso il puntatore l1, peccato però che se l1 è vuota e l2 no, la lista risultante coinciderà con l2... bisogna quindi apportare qualche correzione.
In ogni caso il codice della funzione può essere ottimizzato:
* il flag non serve, basta sostituire nel while la condizione dell'if;
* i puntatori curr1 e curr2 non servono, puoi utilizzare anche l1 e l2 visto che sono passati per copia;
* considerando tutto quello che ho detto (e conservando l'alternanza), farei qualcosa del genere:
void concatena(nodo **l1, nodo **l2)
{
if(!*l1)
{
*l1 = *l2;
*l2 = NULL;
}
else
{
nodo *p;
nodo *curr = *l1;
while(*l2)
{
p = curr->next;
curr->next = *l2;
curr = *l2;
*l2 = p;
}
}
}
Abbandonando l'alternanza tutto si riduce a:
void concatena(nodo **l1, nodo **l2)
{
if(!*l1)
{
*l1 = *l2;
}
else
{
nodo *p = *l1;
while(p->next)
{
p = p->next;
}
p->next = *l2;
}
*l2 = NULL;
}
- per quanto riguarda la funzione ordina():
* perchè la funzione ritorna il primo elemento della lista (che non è un puntatore)?
* non mi sono soffermato molto sul codice alla ricerca di eventuali criticità e ottimizzazioni, ma cmq ho capito qual è l'idea di fondo... e a tal proposito mi tocca dire che stai imbrogliando! Mi spiego meglio... da una funzione che ordina una lista mi aspetto che operi sui puntatori e non sui valori del singolo nodo. Immagina che ogni nodo contenga 100 dati membro, dovresti effettuare una marea di scambi in più rispetto al caso in cui operi invece sui puntatori.