Prima di tutto ti consiglio di scrivere così il prototipo della funzione:
struct cella *elimina(struct cella *punt, char *nome);
In questo modo separi la parte algoritmica da quella di IO, che è sempre una buona cosa.
Questo if non importa, il caso è già gestito automaticamente dal ramo else (mi sono sbagliato prima, non credevo che ci fosse l'if, credevo che eliminassi tutti glie elementi con nome uguale).
Codice:
if(p->next==NULL)
free(punt);
else
{
temp=p;
p=p->next;
punt=p;
free(temp);
}
Anche questo if non serve:
Codice:
if(temp->next!=NULL)//se è un elemento in mezzo alla lista
{
p->next=temp->next;
free(temp);
}
else//se invece è la coda
{
p->next=NULL;
free(temp);
}
Il caso particolare è già contemplato dal ramo sopra.
Cosa succede se non viene trovato "nome" ?