allora, ho riscritto daccapo la routine di cancellazione di un numero dalla lista e funziona bene, c'è solo un problema: perché se inserisco un numero da cancellare che non è in elenco il programma crasha?

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

void crealista();
void visualizzalista();
void eliminanumero();

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

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

main()
{
   char risp;
	
   crealista();
   visualizzalista();
}

void crealista()
{
   printf("Quanti numeri vuoi inserire nella lista? ");
   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;
      }
   }
}

void visualizzalista()
{
   char risp;
	
   system("cls");
   paux = p;
   while (paux != NULL)
   { 
      printf("%i\n",paux->numero);
      paux = paux->pun;
   }
   printf("\n\nVuoi eliminare un numero? (s/n): ");
   scanf("%1s",&risp);
   switch (risp) { 
	case 's': eliminanumero();
	break;
	case 'n': exit(0);
	break;
	default:
	printf("\n%i",risp);
	printf("\n\nIl tasto scelto non permette azioni! Il programma viene terminato");
	exit(0);
}
} 

void eliminanumero()
{
        int dato;
        printf("Che numero vuoi eliminare? ");
        scanf("%i",&dato);
        paux = p;
            while (paux != NULL)
	    {
		    if (paux == p && paux->numero == dato)
		    {
			    p = paux->pun;
			    free(paux);
			    break;
		    }
		    else if (paux->pun->numero == dato)
		    {
			    paux->pun = paux->pun->pun;
			    paux2 = paux->pun;
			    free(paux2);
			    break;
		    }
		    paux = paux->pun;
	    }
visualizzalista();
}