un puntatore contiene un indirizzo di memoria , un puntatore usato come parametro di una funzione contiene UNA COPIA dell'indirizzo passato alla funzione , quindi si può cambiare il contenuto puntato dall'indirizzo , ma essendo una copia non puoi cambiare il puntatore nel main , che continuerà a contenere lo stesso indirizzo .

dovresti modificare la funzione , facendo restituire il puntatore , e approfondire il concetto che ti ho spiegato , tieni presente che quando passi un puntatore a una funzione , passi una copia di un indirizzo .

prototipo :
punt crea_lista(punt P1,punt P0,int N);

nel main :
P1=crea_lista(P1,P0,N);
codice:
punt crea_lista(punt P1,punt P0,int N)    {
            int I, cont=0;
            for (I=0;I<N;I++)
            {        
                    P1=(vagone*)malloc(sizeof(vagone));
                    printf("Inserisci valore: ");
                    scanf("%d",&(P1->ele));
                    if (cont==0)
                    {
                            P1->punt=NULL;
                            cont=cont+1;
                    }
                    else
                    P1->punt=P0;
                    P0=P1;
                    system("PAUSE");
                    printf("%d\n",P1->punt);
                    
            }
            return P1;