codice:
#include <stdio.h>
#include <string.h>
#include <malloc.h>


struct cliente
{
char nome[20];
char cognome[20];
int codice;
struct cliente *next;
};

struct prenotazione
{
int codicecliente;
int stanza;
int giornoarrivo;
int giornopartenza;
int mesearrivo;
int mesepartenza;
}lista[100];

struct data
{
int arrivo;
int partenza;
}calend[100];

int calendario[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};

int numero;
struct cliente *crea();
struct cliente *inserisci(struct cliente *);
void cerca(struct cliente *);
void visualizza(struct cliente *);
void menuprenotazione(struct cliente *);
void menu(struct cliente *);
void elenca();
int gestionedata (int giornoa,int mesea,int giornop,int mesep);
int controllo(int giornoarrivo,int giornopartenza);
struct cliente *creanext(struct cliente *);
struct cliente *creaprimo();
void salvalista(struct cliente *);
int i=1;
int j=0;
main()
{
int c=-1;
struct cliente *p, *new;
while(c!=0)
	{
	printf("\nNella lista sono presenti %d clienti",i-1);
	printf("\nE [%d] prenotazioni",j);
	printf("\n\n\t1.crea nuovo cliente");
	printf("\n\t2.cerca clienti");
	printf("\n\t3.visualizza lista clienti");
	printf("\n\t4.crea prenotazione");
	printf("\n\t5.elenca lista prenotazioni");
	printf("\n\t6.Salva lista cliente sul file di testo [listaclienti.txt]");
	printf("\n\t7.Carica lista clienti da file [listaclienti.txt]");
	printf("\n\nDigita la scelta ---->");
	scanf("%d",&c);
	switch(c)
		{
		case 1: 
			if (i==1)
				{
				p = crea();
				i++;
				new = p;
				break;
				}
			else
				{
				new->next=malloc(sizeof(struct cliente));
				new = inserisci(new->next);
				break;
				}
		case 2: cerca(p); break;
		case 3: visualizza(p); break;
		case 4: menuprenotazione(p); break;
		case 5: elenca(); break;
		case 6: salvalista(p); break;
		case 7: 	
				p = creaprimo();
				i++;
				new = p;
				new->next=malloc(sizeof(struct cliente));
				new = creanext(new->next);
				break;
				
		}
	}
}

struct cliente * crea()
{

struct cliente *p;
		
	p = malloc(sizeof(struct cliente));
	
	printf("\nInserisci nome del cliente  ");
	scanf("%s", p->nome);
	printf("\nInserisci cognome  ");
	scanf("%s", p->cognome);
	p->codice = 1;
	printf("\nAl cliente è stato assegnato il codice [1]\n");
	p->next=NULL;
	return p;
}

struct cliente * inserisci(struct cliente *p)
{


printf("\nInserisci nome del cliente ");
	scanf("%s", p->nome);
	printf("\nInserisci cognome  ");
	scanf("%s", p->cognome);
	p->codice = i;
	printf("\nAl cliente è stato assegnato il codice [%d]\n",i);
	i++;
	p->next= NULL;

	return p;
}

void cerca(struct cliente *p)
{
int codice;
printf("\ndigita il codice cliente---->");
scanf("%d", &codice);


do
	{
	if (p->codice==codice)
		{
		printf("\n\nil codice cliente appartiene a  [ %s %s ]",p->nome,p->cognome);
		}
	
	}
while ((p = p->next) !=NULL);
	
}	

void visualizza(struct cliente *p)
{

	printf("[codice]  [nome]  [cognome]");
while (p!=NULL)
	{
	printf("\n   [%d]    %s   %s\n",p->codice,p->nome,p->cognome);
	
	p = p->next;
	}
}
void menuprenotazione(struct cliente *p)
{
int sel;
	
printf("\nIl cliente che vuole prenotare e' gia' nella lista clienti?");
printf("\n1.si");
printf("\n2.no\nscelta---> ");
scanf("\n%d",&sel);

	switch(sel)
		{
		case 1: menu(p); break;
		case 2: printf("\nBisogna immettere i dati del cliente prima");	break;
		default : printf("\nscelta non valida"); break;
		}
}

void menu(struct cliente *p)
{
int state=0;
int giornoa;
int mesea;
int giornop;
int mesep;
int sel;
printf("\nImmettere codice cliente ->");
scanf("%d",&sel);
	while (p!=NULL)
		{
		if (p->codice==sel)
			{
			printf("\nImmettere dati di arrivo per cliente [%s %s codice(%d)]",p->nome,p->cognome,p->codice);
			do{
			printf("\nImmettere mese di arrivo  ");
			scanf("%d",&mesea);
				if(mesea>12)
               				do
					{
                  			printf("\nERRORE DATA NON VALIDA!\n");
                  			printf("MESE: ");
                     			scanf("%d",&mesea);
               				}
					while(!(mesea<=12));
			printf("\nImmettere giorno di arrivo  ");
			scanf("%d",&giornoa);
            			if(mesea==11||mesea==4||mesea==6||mesea==9)
               				if(giornoa>30)
                  				do{
                     				   printf("\nERRORE DATA NON VALIDA!\n");
                     				   printf("GIORNO: ");
                        			   scanf("%d",&giornoa);
                  			}
					while(!(giornoa<=30)||(giornoa>=31));
             			if(mesea==2)
              				 if(giornoa>29)
                  				do{
                     				  printf("\nERRORE DATA NON VALIDA!\n");
                     				  printf("GIORNO: ");
                        			  scanf("%d",&giornoa);
                  				  }
					while(!(giornoa<=29));
			printf("\nImmettere mese di partenza  ");
			scanf("%d",&mesep);
				if((mesep>12)||(mesep<mesea))
               				do
					{
                  			printf("\nERRORE DATA NON VALIDA!\n");
                  			printf("MESE: ");
                     			scanf("%d",&mesep);
               				}
					while(!((mesep<=12)&&(mesep>=mesea)));
			printf("\nImmettere giorno di partenza  ");
			scanf("%d",&giornop);
            			if(mesep==11||mesep==4||mesep==6||mesep==9)
               				if(giornop>30)
                  				do{
                     				   printf("\nERRORE DATA NON VALIDA!\n");
                     				   printf("GIORNO: ");
                        			   scanf("%d",&giornop);
                  			}
					while(!(giornop<=30)||(giornop>=31));
             			if(mesep==2)
              				 if(giornop>29)
                  				do{
                     				  printf("\nERRORE DATA NON VALIDA!\n");
                     				  printf("GIORNO: ");
                        			  scanf("%d",&giornop);
                  				  }
					while(!(giornop<=29));
			
			state=gestionedata(giornoa,mesea,giornop,mesep);
			
			lista[j].codicecliente=p->codice;
				
			 }while(state==1);
			}
		
		p = p->next;
		}
	lista[j].giornoarrivo=giornoa;
	lista[j].mesearrivo=mesea;
	lista[j].giornopartenza=giornop;
	lista[j].mesepartenza=mesep;
	j++;
}
	
void elenca()
{
int t;
for(t=0;t<j;t++)
	{
	printf("\nPer il cliente con codice [%d]",lista[t].codicecliente);
	printf("\ngiorno arrivo [%d] mese [%d]\n",lista[t].giornoarrivo,lista[t].mesearrivo);
	printf("\ngiorno partenza [%d] mese [%d]\n\n\n",lista[t].giornopartenza,lista[t].mesepartenza);
	}
}

int gestionedata(int giornoa,int mesea,int giornop,int mesep)
{
int sta=0;
int t;
int giornoarrivo=giornoa;
int giornopartenza=giornop;
for (t=0;t<mesea;t++)
	{
	giornoarrivo=giornoarrivo+calendario[t];
	}
	calend[j].arrivo=giornoarrivo;
for (t=0;t<mesep;t++)
	{
	giornopartenza=giornopartenza+calendario[t];
	}
	calend[j].partenza=giornopartenza;
	if (j>0)
	{
	sta=controllo(giornoarrivo,giornopartenza);
	return sta;
	}
}
	

int controllo(int giornoarrivo,int giornopartenza)
{
int t;
for (t=0;t<j;t++)
	{
	if ((giornoarrivo>=calend[t].arrivo)&&(giornoarrivo<=calend[t].partenza)||(giornopartenza>=calend[t].arrivo)&&(giornopartenza<=calend[t].partenza))
		{
		printf("\nData non disponibile visualizzare l'elenco prenotazione e scegliere una prenotazione valida");
		elenca();
		return 1;
		}
	else 
		{
		return 0;
		}
	}
}
void salvalista(struct cliente *p)
{
FILE *fp;

fp=fopen("listaclienti.txt","a+");


while (p!=NULL)
	{
	fprintf(fp,"\n%d %s %s",p->codice,p->nome,p->cognome);
	p = p->next;
	}
fclose(fp);

}

struct cliente *creaprimo()
{
struct cliente *p;
p=malloc(sizeof(struct cliente));

FILE *fp;

fp=fopen("listaclienti.txt","a+");


fscanf(fp,"%d %s %s",&p->codice,p->nome,p->cognome);
p->next=NULL;
fclose(fp);
return p;
}


struct cliente *creanext(struct cliente *p)
{
FILE *fp;

fp=fopen("listaclienti.txt","a+");

while(!feof(fp))
	{
	fscanf(fp,"%d %s %s",&p->codice,p->nome,p->cognome);
	i++;
	}
fclose(fp);
return p;
}

perchè cosi mi salva solo il primo e l'ultimo elemento?