Vediamo un po' che hai scritto...
codice:
void cancella(struct elemento *p,int n)
/*questa funzione immagino prenda l'inizio della lista ed il
valore da cancellare...*/
{
struct elemento *paus;
printf("\n\n\t\tEliminazione occorrenze del \"%d\"....\n",n);
paus = p;
while(p!=NULL) {
if(p->inf==n) { /*se p contiene il numero da cancellare..*/
paus->pun = p->pun;
free(p);
p = (struct elemento*)malloc(sizeof(struct elemento));
/*Qui non hai bisogno del cast esplicito*/
p = paus;
/*In questo butti lo spazio appena allocato!!!!
A cosa ti serve l'allocazione se devi eliminare dei
nodi??*/
}
paus = p;
p = p->pun;
}
}
È strano che non ottieni un bel segmentation fault!!
Nel caso in cui il primo della lista sia da eliminare, con questo
codice fai:
punti paus e p entrambi allo spazio da eliminare
lo elimini tramite p
fai di nuovo puntare p allo spazio a cui non puoi accedere
E' un errore grave!
Inoltre in questo codice, a parte altri errori, c'e' un altro grosso errore di fondo.
Tu dai alla funzione il puntatore allo spazio del primo nodo,
ma se questo poi verra' deallocato, non hai alcun modo di avvertire fuori dalla tua funzione, che l'inizio della lista
e' cambiato!!!!!
Per questo hai due soluzioni:
1-soluzione semplice) Mantieni in una variabile globale il puntatore
all'inizio della lista; cosi non lo devi neanche passare alla funzione
e lo puoi sovrascrivere quando ti serve..
2-un po' piu' complessa) passi alla variabile il puntatore al puntatore del primo nodo :quipy:
E cmq il codice lo devi riscrivere
Ciau
MrC