Se ci rifletti è normale che succeda questo dato che ogni nuovo nodo diventa la testa della lista stessa.
Se vuoi mantenere l'ordine corretto devi aggiungere in coda ogni nuovo nodo che crei.
Per quanto riguarda l'eventualità dei dati non corretti si può semplicemente ignorare le righe non conformi
codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _ElementoLista
{
char identificativo[10];
double reale;
double immaginario;
struct _ElementoLista *next;
} elementoLista, *pElemento;
void stampalista(pElemento a);
int main(void)
{
int result;
char identificativo[10] = "";
double reale = 0.0;
double immaginario = 0.0;
pElemento lista = NULL, nuovoElemento = NULL;
FILE *fp;
fp = fopen("lista_problema_lista.txt", "r");
// fp = fopen("prova.txt", "r");
if( ! fp )
{
printf("Errore apertura file !\n");
exit( -1 );
}
puts("Lettura da file :\n");
while( (result = fscanf(fp, "%s %lg %lg", identificativo, &reale, &immaginario)) != EOF )
{
if( result == 3 )
{
printf("%s = %g + %g\n", identificativo, reale, immaginario);
nuovoElemento = (elementoLista*)malloc(sizeof(elementoLista));
strcpy( nuovoElemento->identificativo, identificativo );
nuovoElemento->reale = reale;
nuovoElemento->immaginario = immaginario;
nuovoElemento->next = lista;
lista = nuovoElemento;
}
}
fclose(fp);
stampalista(lista);
puts("\n\nterminato");
getchar();
return (0);
}
void stampalista(pElemento a)
{
puts("\nContenuto lista :\n");
while( a!=NULL )
{
printf("%s = %g + i%g\n", a->identificativo, a->reale, a->immaginario);
a=a->next;
}
}