Lettura di una lista da file

Possiamo effettuare la lettura di una lista da file semplicemente partendo dalla lista vuota, e aggiungendo ogni volta elementi in testa alla lista. Occorre però tenere presente che la lista contiene gli elementi del file in ordine inverso.

Il seguente programma listafile.c usa la funzione di inserimento in testa per leggere una lista da file. Si tratta di un ciclo: se il file contiene ancora un intero (ossia, se fscanf ritorna 1) lo si mette in testa alla lista; altrimenti, si esce dal ciclo.

/*
  Lettura di una lista da file
(in ordine inverso).
*/

#include<stdlib.h>
#include<stdio.h>


/* il tipo lista */

struct NodoLista {
  int val;
  struct NodoLista *next;
};

typedef struct NodoLista *TipoLista;


/*
  stampa di una lista di lunghezza generica
*/

void StampaLista(TipoLista l) {
  TipoLista s;

  s=l;
  while(s!=NULL) {
    printf("%d ", (*s).val);
    s=(*s).next;
  }

  printf("\n");
}


/*
  aggiunta di un elemento in testa alla lista
*/

void InserisciTestaLista(TipoLista *pl, int e) {
  TipoLista t;

  t=malloc(sizeof(struct NodoLista));
  (*t).val=e;
  (*t).next=*pl;

  *pl=t;
}


/*
  main
*/

int main() {
  FILE *fd;
  int res;
  int x;

  TipoLista l;


		/* apre il file */
  fd=fopen("lista.txt", "r");
  if (fd==NULL) {
    perror("Errore in apertura del file");
    exit(1);
  }


		/* inizializza la lista */
  l=NULL;


		/* legge fino alla fine del file */
  while(1) {
    res=fscanf(fd, "%d", &x);
    if( res!=1 )
      break;

    InserisciTestaLista(&l, x);
  }

  fclose(fd);
  

                /* stampa la lista */

  StampaLista(l);

  return 0;
}

L'unica differenza fra questo programma e quello di lettura di un vettore è che, in questo caso, dopo che si è letto un elemento, lo mettiamo in testa a una lista invece di metterlo nel vettore. Non è più necessaria la variabile per memorizzare l'indice corrente del vettore.