#include #include #include #define MAXCARATTERI 25 struct _posti{ int arrivo; int partenza; char cognome[MAXCARATTERI]; char nome[MAXCARATTERI]; struct _posti *next; }; struct _parcheggio{ int posto; struct _parcheggio *next; struct _posti *disp; }; typedef struct _parcheggio parcheggio; typedef struct _posti posti; parcheggio *head=NULL; FILE *fp; void acquisizione(void); void salva_su_file(void); int affitta(void); void free_all(void); void prenota(char *stringa); parcheggio* cerca(int n_posto, char *stringa); int main(void) { char temp[MAXCARATTERI]; int scelta,disponibilita; acquisizione(); do{ printf("[1]S/s\n[2]A/a\n[3]U/u\n"); gets(temp); scelta=atoi(temp); switch(scelta){ case 1: salva_su_file(); free_all(); acquisizione(); break; case 2: disponibilita=affitta(); if(disponibilita) printf("\nLa prossima data disponibile sara' %d\n",disponibilita); break; case 3: return 1; default: printf("Opzione errata\n"); } }while(scelta!=3); return 0; } void acquisizione(void) { parcheggio *p0,*p1,*temp,*found; posti *p2,*p3,*temp2; int n_posto,inizio,fine; char stringa[80],surname[MAXCARATTERI],name[MAXCARATTERI]; if((fp=fopen("posti.txt","r"))==NULL) { printf("Impossibile aprire il file\n"); exit(1); } while(fgets(stringa,81,fp)!=NULL) { if(!head) { head=(parcheggio*)malloc(sizeof(parcheggio)); head->disp=(posti*)malloc(sizeof(posti)); head->disp->next=NULL; sscanf(stringa,"%d %d %d %s %s",&head->posto,&head->disp->arrivo,&head->disp->partenza,head->disp->cognome,head->disp->nome); head->next=NULL; } else { found=cerca(0,stringa); sscanf(stringa,"%d %d %d %s %s",&n_posto,&inizio,&fine,&surname,&name); if(found==NULL) { p0=NULL; for(p1=head;p1!=NULL && p1->postonext) p0=p1; temp=(parcheggio*)malloc(sizeof(parcheggio)); temp->posto=n_posto; temp->disp=(posti*)malloc(sizeof(posti)); temp->disp->arrivo=inizio; temp->disp->partenza=fine; temp->disp->next=NULL; strcpy(temp->disp->cognome,surname); strcpy(temp->disp->nome,name); temp->next=p1; if(p0) p0->next=temp; else head=temp; temp=NULL; } else { p2=NULL; for(p3=found->disp;(p3!=NULL) && (p3->partenzanext) p2=p3; temp2=(posti*)malloc(sizeof(posti)); temp2->arrivo=inizio; temp2->partenza=fine; strcpy(temp2->cognome,surname); strcpy(temp2->nome,name); temp2->next=p3; if(p2) p2->next=temp2; else found->disp=p2; } } } fclose(fp); } parcheggio* cerca(int n_posto, char *stringa) { parcheggio *p1; p1=head; if(!n_posto) sscanf(stringa,"%d",&n_posto); for(p1=head;p1!=NULL;p1=p1->next) if(p1->posto==n_posto) return p1; return NULL; } void free_all(void) { parcheggio *p0,*p1; posti *p2,*p3; p0=head; while(p0) { p2=p0->disp; while(p2) { p3=p2; p2=p2->next; free(p3); } p1=p0; p0=p0->next; free(p1); } head=NULL; } void salva_su_file(void) { parcheggio *p1; posti *p0; fp=fopen("posti.txt","w"); for(p1=head;p1!=NULL;p1=p1->next) for(p0=p1->disp;p0!=NULL;p0=p0->next) fprintf(fp,"%d %d %d %s %s\n",p1->posto,p0->arrivo,p0->partenza,p0->cognome,p0->nome); fclose(fp); } int affitta(void) { parcheggio *p1; posti *p2,*temp; char stringa[80],surname[MAXCARATTERI],name[MAXCARATTERI]; int inizio,fine,prossima_disp=366,ok=1; do{ printf("\nInserisci data di arrivo di partenza cognome nome separati da uno spazio: "); gets(stringa); sscanf(stringa,"%d %d %s %s",&inizio,&fine,&surname,&name); }while((fine365) || (fine<1 || fine>365)); for(p1=head;p1!=NULL;p1=p1->next) for(p2=p1->disp;p2!=NULL;p2=p2->next) { if(p2->arrivo==0) { p2->arrivo=inizio; p2->partenza=fine; strcpy(p2->cognome,surname); strcpy(p2->nome,name); return 0; } else if(p2->arrivo>fine && p2->arrivo>inizio) { if(ok) { temp=(posti*)malloc(sizeof(posti)); temp->arrivo=inizio; temp->partenza=fine; strcpy(temp->cognome,surname); strcpy(temp->nome,name); temp->next=p2; p1->disp=temp; return 0; } else { if(((p2->partenza)+1>inizio) && ((p2->partenza)+1disp->partenza)+1; } } else if(p2->partenzanext!=NULL){ if(p2->next->arrivo>fine) { temp=(posti*)malloc(sizeof(posti)); temp->arrivo=inizio; temp->partenza=fine; strcpy(temp->cognome,surname); strcpy(temp->nome,name); temp->next=p2->next; p2->next=temp; return 0; } } else if(ok) { temp=(posti*)malloc(sizeof(posti)); temp->arrivo=inizio; temp->partenza=fine; strcpy(temp->cognome,surname); strcpy(temp->nome,name); temp->next=NULL; p2->next=temp; return 0; } else if(((p2->partenza)+1>inizio) && ((p2->partenza)+1disp->partenza)+1; } } return prossima_disp; }