/* inserire n elementi in una lista */ lista leggi( void ) { int d; lista l=NULL; posizione p; while( scanf("%d", &d) == 1 ) { p=newNode(); p->dato=d; p->next=l; l=p; } return l; } Brevemente l=NULL d= ----dato letto----- alla fine del primo ciclo ________________ p--------------------------------------------------------------->!dato letto!NULL ! l --------------------------------------------------------------> _________________ alla fine del secondo ciclo ________________ ____________________ p------->!dato 2 ! ---!-----------> !dato letto ! NULL ! l ------> _________________ ____________________ I dati nuovi vengono inseriti in testa, davanti a tutti i precedenti. La lista viene realizzata in ordine opposto rispetto alla lettura. Nuova versione che rispetta l'ordinamento. Si utilizza una nuova variabile di tipo posizione, per indicare l'ultimo elemento della lista. lista leggi( void ) { int d; lista l=NULL; posizione p, ultimo=NULL; while( scanf("%d", &d) == 1 ) { p=newNode(); p->dato=d; p->next=NULL; /* il nuovo elemento sarà l'ultimo !!! */ if( l==NULL ) /* è il primo inserito? */ l=ultimo=p; else ultimo=p; } return l; } /* versione ricorsiva inserendo gli elementi in testa */ lista leggi( lista l ) { int d; posizione p; if( scanf("%d", &d )==1 ) { p=newNode(); p->dato=d; p->next=l; return leggi( p ); } return l; } Per rendere più leggibile questa funzione introduco una nuova primitiva che, avuto in ingresso un dato e una lista, restituisce una nuova lista con il nuovo dato in testa. lista cons( int dato, lista l ){ puntatore p=newNode(); p->dato=dato; p->next=l; return p; } la funzione vista prima diventa lista leggi( lista l ) { int d; if( scanf("%d",&d )==1 ) return leggi( cons(d,l) ); return l; }