/*
  Inserimento in lista ordinata.
*/

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


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


/*
  inserimento in lista ordinata
*/

void InserisciListaOrdinata(TipoLista *pl, int e) {
  TipoLista s, r;

		/* la lista non contiene elementi */
  if(*pl==NULL) {
    *pl=malloc(sizeof(struct NodoLista));
    (*pl)->val=e;
    (*pl)->next=NULL;
    return;
  }


		/* l'elemento va inserito in prima posizione */
  if((*pl)->val>=e) {
    s=*pl;
    *pl=malloc(sizeof(struct NodoLista));
    (*pl)->val=e;
    (*pl)->next=s;
    return;
  }



			/* la lista ha piu' di un elemento */
  s=*pl;
  while(s->next!=NULL) {

    if(s->next->val>e) {
      r=s->next;
      s->next=malloc(sizeof(struct NodoLista));
      s->next->val=e;
      s->next->next=r;
      return;
    }

    s=s->next;
  }


			/* se arrivo qui, l'elemento va inserito in fondo */
  s->next=malloc(sizeof(struct NodoLista));
  s->next->val=e;
  s->next->next=NULL;


  return;
}


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


		/* aggiungi un elemento */
  InserisciListaOrdinata(&l, 2);


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

  return 0;
}
