Ciao , visto che nella funzione delete , non usi la funzione free() , mi pare che non si possa considerare corretta , ti metto un esempio di come implementerei io la funzione , POSSONO esserci errori


codice:
struct entry *Delete (struct entry *list_head, int DaEliminare)
{
 struct entry *list_record,*list_pointer;
 
/*
     list_pointer e list_record , partono puntando entrambi alla testa della lista
	 quando il ciclo for incrementa , troviamo che  list_record punta al nodo sucessivo , e 
	 list_pointer al nodo che precede
     il ciclo termina quando list_record è NULL o quando ha trovato valore
	 con un if , non dipendente dal for controllo se ha trovato valore 




*/ 
 for(list_pointer=list_head, list_record=list_head; list_record!=NULL && list_record->valore!=DaEliminare; list_pointer=list_record, list_record=list_record->next);
 if(list_record->valore==DaEliminare)
 {
      if(list_record!=list_head)//se il nodo da eliminare non è la testa
	  {
          list_pointer->next=list_record->next //List pointer next ,puntava a record, adesso punta al nodo sucessivo  
		  free(list_record);//elimino il nodo in memoria
		  return list_head;
      }
	  else //il nodo da eliminare è il primo 
	  {
	      list_pointer=list_record->next  
		  free(list_record);//elimino il nodo in memoria
		  return list_pointer;
	  
	  }
 }
 
  return list_head;
       
}