/*
  Eliminazione ultimo elemento di una lista.
(seconda versione errata).
*/

#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;
}


/*
  eliminazione ultimo elemento di una lista
(seconda versione: errata)
*/

void EliminaUltimoLista(TipoLista *pl) {
  TipoLista r;

  r=*pl;

  while(r->next!=NULL)
    r=r->next;

  free(r);
  r=NULL;
}


/*
  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);


		/* elimina ultimo elemento */

  EliminaUltimoLista(&l);
  

                /* stampa la lista */

  StampaLista(l);

  return 0;
}
