Ritorno a voi con un programma modificato penso al più abb correttamente anche se alcune funzioni sono ancora in sviluppo . Come consigliatomi ho cercato di risolvere il problema dell'allocazione di memoria. ora vi posto il programma e vi spiego l'inghippo in cui sono caduto
//  Questo Programma Calcola il Consumo di vari dispositivi , esporta il file in un file di testo
//  visualizza la lista di dispositivi presenti nel file  o elimina dati dal file.
#include <stdio.h>
#include <malloc.h>
struct Dispositivo{    	// typedef struct dispositivo Disp;
 	int ID;
    char nome[10];
	int watt;
	float TotaleNetto;
	float Totale;
	struct Dispositivo *nextPtr;
};
typedef struct Dispositivo TipoDispositivo; //viene ridefinito "struct Dispositivo" come TipoDispositivo
typedef TipoDispositivo *DispPtr;  //viene definito un tipo puntatore "TipoDispositivo *" 
void menu (void);
void salvalista (TipoDispositivo *);
//void stampadispositivi (void);
//void eliminadato (void);
void calcolaconsumo(TipoDispositivo *);
void nuovodispositivo(TipoDispositivo *);
int main(){
TipoDispositivo *DispoPtr= NULL; 
int scelta;
while (scelta =!0) {
menu();
scelta = getchar();
switch (scelta){
    
    case '1' :
    nuovodispositivo(DispoPtr);
    printf("Caratteristiche DispoPtr:\n ID : %d\n Nome : %s\n Totale Netto : %f\n Totale : %f\n",(*DispoPtr).ID,(*DispoPtr).nome,(*DispoPtr).TotaleNetto,(*DispoPtr).Totale );
    break;
	case '4' :
	salvalista(DispoPtr); //&Device
	break;
	case '2' :
	//stampadispositivi();
	break;
	case '3' :
	//eliminadato();
	break;
	default : printf("Scelta non corretta");
	break;
		  }
}
return 0;
}
//------------------------------------------------------//
void menu (void) {
printf("-----Menù-----\nInserire un numero per determinare l'azione da intraprendere\n");
printf("1)Aggiungi un dispositivo alla lista\n2)Stampa lista dei dispositivi \n3)Elimina registro\n4)Salva la lista in un file\n");}
//------------------------------------------------------//
void nuovodispositivo (TipoDispositivo *DevicePtr) {
     
TipoDispositivo *newDevicePtr;
TipoDispositivo *previousDevicePtr;
TipoDispositivo *currentDevicePtr;
newDevicePtr = malloc(sizeof(TipoDispositivo));
if( newDevicePtr !=NULL) {
    calcolaconsumo(newDevicePtr);
    printf("Caratteristiche newDevicePtr:\n ID : %d\n Nome : %s\n Totale Netto : %f\n Totale : %f\n",(*newDevicePtr).ID,(*newDevicePtr).nome,(*newDevicePtr).TotaleNetto,newDevicePtr->Totale );
    (*newDevicePtr).nextPtr= NULL;
    previousDevicePtr = NULL;
    currentDevicePtr= DevicePtr;
    printf("cucu\n"); 
    while (currentDevicePtr!=NULL && (*currentDevicePtr).ID >(*newDevicePtr).ID){
          previousDevicePtr=currentDevicePtr;
          currentDevicePtr=(*currentDevicePtr).nextPtr;
          printf("cucu2\n");}
          if(previousDevicePtr == NULL){ 
              (*newDevicePtr).nextPtr=DevicePtr;
              DevicePtr=newDevicePtr;
    printf("Caratteristiche DevicePtr:\n ID : %d\n Nome : %s\n Totale Netto : %f\n Totale : %f\n",(*DevicePtr).ID,(*DevicePtr).nome,(*DevicePtr).TotaleNetto,newDevicePtr->Totale );
              }
          else{
               (*newDevicePtr).nextPtr=currentDevicePtr;
               (*previousDevicePtr).nextPtr=newDevicePtr;
               printf("cucu3\n");
               }          
    
    printf("cucu4\n");
}
else { printf("Errore, Memoria non disponibile"); }
}
//------------------------------------------------------//
void salvalista (TipoDispositivo *Dispo) { //*&Device
FILE *ListDevPtr;
TipoDispositivo *currentPtr;
  if (( ListDevPtr = fopen("ListaDispositivi.txt", "wb+")) == NULL){
  	 printf("Il file non può essere aperto");
       }
	 else{
          if (Dispo !=NULL){
             currentPtr=Dispo;
             while((*currentPtr).nextPtr!=NULL){
                fwrite(¤tPtr,sizeof(TipoDispositivo),1,ListDevPtr);    //&*Dispo=&Device
                currentPtr=(*currentPtr).nextPtr;
             }
          }
          else{
               printf("Lista Dispositivi vuota, impossibile salvare l'elenco dei dispositivi\n");
               return;
               }
             fclose(ListDevPtr);
     }
}
//------------------------------------------------------//
void calcolaconsumo (TipoDispositivo *DevicePtr){                  //*&Device
float QFV = 0.0819672131;
float QFD = -0.0369603825;
float QEF1 = 0.09702;
float QEF2 = 0.08631;
float DF1 = 0.01154;
float DF2 = 0.01154;
float DV = 0;
float pereq = -0.00065 ;
float QPOT = 0.0154090164 * 3;
float QFR = 0.0163934426;
float QVR = 0;
float IEC = 0.0227;
int wattaggio;
float kwh;
int anno = 365;
int oref1;
int oref2;
int ore;
float Totale;
float TotQFV;
float TotQF;
float TotQE;
float TotQEF1;
float TotQEF2;
float TotRete;
float TotImposte;
printf("Inserisci l'ID del Dispositivo, 0 per tornare al menu\n");
	       scanf("%d", &(*DevicePtr).ID);
	       printf ("ID Dispositivo: %d\n", (*DevicePtr).ID);
printf("Inserisci Il Nome del Dispositivo, 0 per tornare al menu\n");
	       scanf("%s", (*DevicePtr).nome);
	       printf ("Nome Dispositivo: %s\n", (*DevicePtr).nome);
printf("Inserire in Watt il consumo del dispositivo da misurare -1 per uscire \n>");
scanf("%d", &wattaggio );
      printf("Inserire il monte ore in fascia F1 di attività  del dispositivo\n>");
      scanf("%d", &oref1);
      printf("Inserire il monte ore in fascia F2 di attività  del dispositivo\n>");
      scanf("%d", &oref2);
      ore = oref1 + oref2;
            
      kwh = (float) wattaggio / 1000;
      TotQFV= (QFV + QFD) * anno;
      TotQEF1 = (QEF1+DF1)* kwh * anno * oref1;
      TotQEF2 = (QEF2+DF2)* kwh * anno * oref2;
      TotQE= ((DV + pereq) * kwh * anno * ore) + TotQEF1 + TotQEF2;
      TotRete= (QFR + QVR + QPOT) * anno;
      TotImposte = IEC * anno;
      TotQF= TotQFV + TotRete ; 
      Totale = TotQF + TotQE + TotImposte;
            printf( "Ecco quanto consuma il dispositivo annualmente\n\n");
            printf ("Totale Consumo : %f kwh/anno\n", kwh * anno * ore);
            printf("Totale Quota Energia :%f euro/anno\n", TotQE);
            printf("Totale Quota Fissa :%f euro/anno\n", TotQF);
            printf("Totale Imposte :%f euro/anno\n", TotImposte);
            printf("Totale Imposte Rete :%f euro/anno\n", TotRete);
            printf ("Totale imposte comprese : %f euro/anno \n\n" ,Totale);
            
            (*DevicePtr).watt = wattaggio;   //Device.watt ecc
            DevicePtr->Totale = Totale;      //Device.Totale con operatore freccia
            (*DevicePtr).TotaleNetto = Totale - TotImposte;       
            
            printf("Caratteristiche Dispositivo:\n ID : %d\n Nome : %s\n Totale Netto : %f\n Totale : %f\n",(*DevicePtr).ID,(*DevicePtr).nome,(*DevicePtr).TotaleNetto,DevicePtr->Totale );   
}
Dunque intanto i vari printf ("cucu"), o printf("Caratteristiche Dispositivo") servono per rendermi conto del percorso del flusso di esecuzione e del valore dei dati nella struct che devono rimanere uguali ad ogni ritorno.
Il Problema è il seguente in main nel case 1 dello switch chiedo ancora una volta a printf di farmi vedere cosa contiene la struct e il programma compila ma mi restituisce un segmentation fault