#include <stdio.h>

typedef struct el {
	int val;
	struct el *next;
} elem;



void aggiungi( elem **lista, int v )
{
	elem *nuovo;
	
	// La lista e' vuota?
	if ( *lista == NULL )
	{
		nuovo = (elem *)malloc( sizeof(elem) );
		nuovo->val = v;
		nuovo->next = NULL;
		*lista = nuovo;
		return;
	}

	/* NOTA:
	 * Il contenuto del blocco if fa' esattamente la stessa cosa
	 * delle quattro righe che seguono, dato che l'if stesso viene
	 * eseguito solo se *lista==NULL.
	 * Quindi potete eliminare il blocco if, ricompilare il programma e
	 * questo funzionera' comunque, ma con un netto risparmio sulla
	 * quantita' di codice scritto.
	 */

	nuovo = (elem *)malloc( sizeof(elem) );
	nuovo->val = v;

	// Le due righe seguenti non possono essere scambiate di ordine
	// perche' altrimenti perderei il contenuto di *lista prima di
	// assegnarlo a nuovo->next.
	nuovo->next = *lista;
	*lista = nuovo;
}



void stampa( elem *lista )
{
	// In questa funzione modifico il puntatore lista utilizzandolo per
	// scorrere tutti gli elementi. Questo non modifica il puntatore lista
	// dichiarato nel main perche' sto utilizzando una copia di quel
	// puntatore (dato che il passaggio di parametri e' per copia).
	printf( "La lista contiene: ( " );
	while ( lista != NULL )
	{
		printf( "%d ", lista->val );
		lista = lista->next;
	}
	printf( ")\n" );
}


int main()
{
	elem *lista;

	lista = NULL;	// All'inizio la lista e' vuota!

	do
	{
		int v;
		
		printf( "Inserisci un elemento (0 quando hai finito): " );
		scanf( "%d", &v );
		if ( v==0 )
			break;

		aggiungi( &lista, v );
	}
	while(1);	// Ripete all'infinito

	stampa( lista );
	return(0);
}

