Con i puntatori non è che me la cavi bene
per l'inserimento in testa a una lista , mi dava i tuoi stessi problemi , assegnando al puntatore
passato per argomento , il nuovo nodo della lista , non me lo restituiva nel main , non so il perchè
ma io ho risolto restituendolo con un return , e funziona !
il perchè da problemi occorre che qualche esperto si faccia sentire , aspettiamo in dure

il typedef non ti da problemi , provato e funziona .
codice:
nodo inseriscicoda(nodo il){
int m;
printf ("\nDigita 1 per inserire un numero, altrimenti digita 0\n");
scanf ("%d",&m);
while (m==1)
{
if (il==NULL){
nodo p2 = NULL;
p2= malloc (sizeof(struct numeri));
p2->succ=NULL;
printf ("Digita il numero da inserire:\n");
scanf ("%d", &p2->elemento);
p2->succ = il;
il = p2;}
else
{
nodo tm= il;
while (tm->succ!=NULL)
tm = tm->succ;
nodo nuovo= malloc(sizeof(struct numeri));
printf("Digita il numero\n");
scanf("%d", &nuovo->elemento);
nuovo->succ=NULL;
tm->succ=nuovo;}
printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
scanf ("%d",&m);}
return il;
}
nodo inseriscitesta(nodo il){
int y;
printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
scanf ("%d",&y);
while (y==1)
{
nodo p2 = NULL;
p2= malloc (sizeof(struct numeri));
p2->succ=NULL;
printf ("Digita il numero da inserire:\n");
scanf ("%d", &p2->elemento);
p2->succ = il;
il = p2;
printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
scanf ("%d",&y);}
return il;
}
int main(int argc, char *argv[])
{
int y;
nodo il=NULL;
il= malloc (sizeof (struct numeri));
il->succ=NULL;
printf ("Digita 1 per inserire un numero, altrimenti digita 0\n");
scanf ("%d", &y);
if (y==1)
{printf ("Inserisci il nuemero:\n");
scanf ("%d", &il->elemento);}
il=inseriscitesta(il);
stampalista (il);
il=inseriscicoda(il);
stampalista (il);