/* Data una lista l1 di interi ed un intero x, definire una funzione ricorsiva di coda che restituisce una nuova lista che contiene tutti i nodi di l1 in posizione non multipla di x */ lista multipla( lista l, lista new, int x, puntatore coda, int i ) { posizione e; if( l == NULL ) return new; if( i % x == 0) /* posizione multipla continuo senza modificare la nuova lista */ return multipla( l->next, new, x, coda, i+1); e = newNode(); e->dato = l->dato; e->next = NULL; if( new == NULL ) { /* se è il primo elemento della lista nuova */ return multipla( l->next, e, e, i+1 ); coda->next = e; return multipla( l->next, new, e, i+1 ); } se l è vuota restituisco la nuova (new) se il primo elemento di l è in posizione multipla di x controllo i rimanenti, conteggiando i se è la prima volta che inserisco un elemento in new tale elemento sarà sia primo che ultimo continuo con i rimanenti e conteggio altrimenti continuo con i rimanenti agganciando il nuovo nodo in fondo a new. Modifico l'ultimo. /* versione ricorsiva */ lista multipla( lista l, int x, int i ) { puntatore p; if( l == NULL ) return NULL; if( i % x == 0 ) return multipla( l->next, x, i+1); p = newNodo(); p->dato = l->dato; p->next = multipla( l->next, x, i+1); return p; } Creo un nodo lasciando in sospeso il contenuto del campo next. Solo alla fine si saprà il valore da inserire. Utilizzando la funzione cons() lista multipla( lista l, int x, int i ) { puntatore p; if( l == NULL ) return NULL; if( i % x == 0 ) return multipla( l->next, x, i+1 ); return cons( l->dato, multipla( l->next, x, i+1 )); }