in modo iterativo mi funziona...se qualcuno è capace a farlo ricorsivo

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

struct hello {
	int n;
	struct hello *next;
};

typedef struct hello hello;


/* Funzione che crea il primo elemento */
hello *crea(hello *p, int ins)
{
	p = malloc(sizeof(hello));
	p->n = ins;
	p->next = NULL;
	return p;
}

/* Crea elementi successivi */
hello *aggiungi(hello *p, int ins)
{
	hello *paus, *prev, *curr;
	paus = malloc(sizeof(paus));
	paus->n = ins;
	paus->next = NULL;
	
	prev = NULL;
	curr = p;
	
	while(curr != NULL) {
		prev = curr;
		curr = curr->next;
	}
		prev->next = paus;
		paus->next = curr;
	return p;
	
}

/* Funzione ricorsiva che stampa la lista */
void stampa(hello *p)
{
	if (p == NULL)
		printf("NULL\n");
	else {
		printf("%d -> ", p->n);
		stampa(p->next);
	}
}


main()
{
	hello *puntLista;
	int ins;
	printf("Inserisci il primo elemnto - 0 per finire\n");
	scanf("%d", &ins);
	puntLista = crea(puntLista, ins);
	while (ins != 0) {
		printf("Inserisci elemento successivo\n");
		scanf("%d", &ins);
		puntLista = aggiungi(puntLista, ins);
	}
	stampa(puntLista);
}