/*
  Elimina gli elementi negativi da una lista di interi.
*/

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


/*
  legge una lista, in ordine
*/

TipoLista LeggiListaFile(char *nomefile) {
  FILE *fd;
  int res;
  int x;
  TipoLista l, s;

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

                        /* legge gli elementi in ordine */
  l=NULL;

  while(1) {
    res=fscanf(fd, "%d", &x);
    if(res!=1)
      break;

    if(l==NULL) {
      l=malloc(sizeof(struct NodoLista));
      s=l;
    }
    else {
      s->next=malloc(sizeof(struct NodoLista));
      s=s->next;
    }

    s->val=x;
    s->next=NULL;
  }

                        /* chiude il file */
  fclose(fd);

  return l;
}


/*
  elimina gli elementi negativi da una lista
*/

void EliminaNegativi(TipoLista *pl) {
  TipoLista s, r;


		/* lista vuota: niente da eliminare */
  if(*pl==NULL)
    return;

                /* eliminazione negativi dal secondo in poi */
  if((*pl)->next!=NULL) {
    s=*pl;
    while(s->next!=NULL) {
      if(s->next->val < 0 ) {
        r=s->next;
        s->next=s->next->next;
        free(r);
      }
      else
        s=s->next;
    }
  }

                /* elimina primo elemento se negativo */
  if((*pl)->val<0) {
    r=*pl;
    *pl=(*pl)->next;
    free(r);
  }

}


/*
  main
*/

int main(int argn, char *argv[]) {
  FILE *fd;
  int res;
  int x;

  TipoLista l;


		/* controllo argomenti */
  if(argn-1!=1) {
    printf("Richesto un solo argomento: ");
    printf("il nome del file che contiene la lista\n");
    exit(1);
  }



		/* legge la lista da file */
  l=LeggiListaFile(argv[1]);


		/* stampa la lista */
  StampaLista(l);


		/* eliminazione elementi negativi */
  EliminaNegativi(&l);


                /* stampa la lista */
  StampaLista(l);

  return 0;
}
