Ciao! Ho un problemino con questo programma, praticamente dovrebbe creare una lista dinamica ed eliminare poi tutti i valori inferiori ad un certo numero che specifico dalla lista. Solo che va in crash quando raggiunge l'ultimo numero della lista Come mai?

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

void crealista();
void visualizzalista();
int eliminanumero(int dato);

struct elenco {
   int numero;
   struct elenco *pun;
   };

int i,n;
struct elenco *p,*paux, *paux2;

main()
{
     int val,i;
	
     crealista();
   
     printf("Quale e' il numero al di sotto del quale vuoi eliminare i numeri piu piccoli?:  ");
     scanf("%i",&val);
     while (i != 0) 
     {
		i = eliminanumero(val);
     } 
     visualizzalista();
	
}

void crealista()
{
   printf("Inserisci la quantita' dei numeri da inserire: ");
   scanf("%i",&n);

   if (n==0)
      p = NULL;
   else
   {
      p = (struct elenco *)malloc(sizeof(struct elenco));
      printf("\nInserisci il valore: ");
      scanf("%i",&p->numero);
      paux = p;
      for (i=1;i<=n-1;i++)
      {
         paux->pun = (struct elenco *)malloc(sizeof(struct elenco));
         paux = paux->pun;
         printf("\nInserisci il valore: ");
              scanf("%i",&paux->numero);
              if (i==n-1)
                paux->pun = NULL;
      }
   }
}

int eliminanumero(int dato)
{
	paux = p;
            while (paux != NULL)
	    {
		    if (paux == p && paux->numero < dato)
		    {
			    p = paux->pun;
			    free(paux);
			    return 1;
		    }
		    else if (paux->pun->numero < dato)
		    {
			    paux->pun = paux->pun->pun;
			    paux2 = paux->pun;
			    free(paux2);
			    return 1;
		    }
		    paux = paux->pun;
	    }
	    return 0;
} 
void visualizzalista()
{
   system("cls");
   paux = p;
   while (paux != NULL)
   { 
      printf("%i\n",paux->numero);
      paux = paux->pun;
   }
}
grazie mille