Salve a tutti! Sto scrivendo un semplice programma c che prenda da standard input una serie di interi, li inserisca in una lista e poi stampi la lista. Ecco il codice:

codice:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

struct nodo {
int val;
struct nodo *next; //puntatore al nodo successivo
};

void inserisci_valore(int num, struct nodo **pnext);
struct nodo *alloca_mem();
void stampa_lista(struct nodo *p);
void inserisci_inlista(struct nodo *nuovo, struct nodo **pnext);


int main(int argc, char *argv[])
{
    int num;
    struct nodo *testa_lista =NULL; //all'inizio la lista è vuota

    if (argc!=1)
    {   /*l'utente non dovrebbe inserire argomenti*/
        fprintf(stderr, "Usage %s [<file] [>file]\n ", argv[0]);
        return(EXIT_FAILURE);
    }

    /*lettura dallo standard input*/
    while(feof(stdin)==0){
    if(scanf("%d", &num)==1)
    {
        inserisci_valore(num,&testa_lista);
    }
    }

    stampa_lista(testa_lista);

    return EXIT_SUCCESS;

}

void inserisci_valore(int num, struct nodo **phead)
{
    struct nodo *nuovo;
    nuovo=alloca_mem();
    nuovo->val=num;

   inserisci_inlista(nuovo,phead);
}

void inserisci_inlista(struct nodo *nuovo, struct nodo **pnext){

    struct nodo *p;
    nuovo->next=*pnext;
    *pnext= nuovo;

}


struct nodo *alloca_mem(void)
{
     struct nodo *p;
     p=malloc(sizeof(struct nodo));
     if(p==NULL)
     {
         fprintf(stderr,"Errore nell'allocazione della memoria\n");
         exit(EXIT_FAILURE);
     }
 return p;
}


void stampa_lista(struct nodo *p)
{
    struct nodo *n;
    if (p==NULL)
        printf ("Impossibile stampare,lista vuota!\n");

    for(n=p; n!=NULL; n=n->next)
    {
        printf( "%d \n", p->val);
    }
}
Il problema è che se inserisco per esempio 3 4 5 6 mi viene stampato:
6
6
6
6

cosa sto sbagliando??