/* suddividere una lista in due liste, utilizzando il seguente criterio: inserisco in l1 sino a quando non è rispettato l'ordinamento allora inserisco in l2 sino a quando non è rispettato l'ordinamento ripeto il processo sino a quando la lista iniziale è vuota */ Si può pensare di scrivere una funzione void suddividi( node **l1, node **l2, node **l ) { int sw = 0; node *coda1 = NULL, *coda2 = NULL; while( *l != NULL ) { if(sw == 0){ if( coda1 == NULL ) { *l1 = coda1 = *l; *l = (*l)->next; coda1->next = NULL; } else if( coda1->dato < (*l)->dato ) { coda1 = coda1->next = *l; *l = (*l)->next; coda1->next = NULL; } else { sw = 1; if( coda2 == NULL ) { *l2 = coda2 = *l; *l = (*l)->next; coda2->next = NULL; } else { coda2 = coda2->next = *l; *l = (*l)->next; coda2->next = NULL; } } } else /* si ripete per la seconda lista ........ */ } } Questa funzione è "troppo complicata". Si deve modificare l'algoritmo nel seguente modo: COPIO NELLA PRIMA LISTA SINO A QUANDO VA BENE COPIO NELLA SECONDA CODA SINO A QUANDO VA BENE RIPETO TUTTO SINO A QUANDO LA LISTA IN INGRESSO è VUOTA void suddividi( node **l1, node **l2, node **l ) { node *coda1 = NULL, *coda2 = NULL; while( *l != NULL ) { copia(l1, l, &coda1); copia(l2, l, &coda2); } } void copia( node **nx, node **l, node **coda) { int p = 0; while( (*l != NULL) && ( (p == 0) || ((*coda)->dato < (*l).dato) ) ) { p=1; inCoda(nx, l, coda); } } void inCoda( node **n, node **l, node **coda) { if( *coda == NULL ) { *coda = *n = *l; else *coda = (*coda)->next = *l; *l = (*l)->next; (*coda)->next = NULL; } Scrivere una funzione split che suddivide gli elementi della prima lista mettendo il primo nella prima lista, ilsecondo nella seconda il terzo nella prima e ....