//© FOGGY HARDO STECHO #include #include #include #include #define MAX_P 100 #define MAX_S 21 #define MAX_PD 10 #define CODE 7 typedef struct _dip{ char matr[CODE]; char nome[MAX_S]; int num_prj; struct _dip *next; struct _prj *punta[MAX_PD]; } dip; typedef struct _prj{ char progetto[MAX_S]; struct _puntatore *primo; } prj; typedef struct _puntatore{ dip *impiegato; struct _puntatore *next; } puntatore; FILE *fp; dip *head=NULL; prj progetti[MAX_P]; void carica(void); int hash(char *); void stampa_dip (void); void stampa_prog (void); void sposta (void); int main(void) { int i,scelta,ok=1; char riga[80]; for(i=0;inum_prj=0; sscanf(stream,"%s %s",head->matr,head->nome); } else { temp=(dip*)calloc(1,sizeof(dip)); temp->num_prj=0; sscanf(stream,"%s %s",temp->matr,temp->nome); p0=NULL; for(p1=head;p1!=NULL && (strcmpi(temp->nome,p1->nome)>0);p1=p1->next) p0=p1; if(p0!=NULL) { p0->next=temp; temp->next=p1; } else { temp->next=p1; head=temp; } } } fclose(fp); if((fp=fopen("progetti.txt","r"))==NULL) { printf("Frocissimo\n"); getch(); exit(1); } while((fgets(stream,81,fp))!=NULL) { sscanf(stream,"%s %s",str1,str2); n=hash(str2); for(p1=head;p1!=NULL && ((strcmpi(str1,p1->matr))!=0);p1=p1->next); app=(puntatore*)calloc(1,sizeof(puntatore)); if(progetti[n].primo==NULL) { strcpy(progetti[n].progetto,str2); progetti[n].primo=app; } else { for(app2=progetti[n].primo;app2->next!=NULL;app2=app2->next); app2->next=app; } app->impiegato=p1; if(p1->num_prj<10) p1->punta[p1->num_prj++]=&progetti[n]; else { printf("Impara a scrivere frociazzo!\n"); getch(); exit(2); } } } int hash(char *str2) { int zio=0,i; for(i=2;i<3;i++) zio+=str2[i]; i=zio%100; while((strcmpi(progetti[i].progetto,str2))!=0 && (progetti[i].primo!=NULL)) i++; return i; } void sposta(void) { char riga[80],riga1[80]; int i=0,n; puntatore *app,*app2; dip *p1=head; printf("inserire il nome del dipendente.\n"); gets(riga1); while(p1!=NULL&&(strcmpi(riga1,p1->nome)!=0)) p1=p1->next; //dipendente trovato if(p1==NULL) printf("dipendente non trovato"); else { printf("inserire il nome del progetto da cui deve essere rimosso.\n"); gets(riga); while(strcmpi(p1->punta[i]->progetto,riga)!=0&&i<10) i++; // progetto trovato if(i==10) printf("dipendente non impiegato nel progetto"); else { n=hash(riga); app=progetti[n].primo; app2=NULL; while(app!=NULL&&strcmpi(app->impiegato->nome,riga1)!=0) { app2=app; app=app->next; } if(app2==NULL) progetti[n].primo=app->next; else app2->next=app->next; free(app); printf("inserire nome del progetto a cui deve essere assegnato.\n"); gets(riga); n=hash(riga); app=progetti[n].primo; while(app->next!=NULL) app=app->next; app2=(puntatore *)calloc(1,sizeof(puntatore)); app->next=app2; app2->impiegato=p1; p1->punta[i]=&progetti[n]; } } } void stampa_prog (void) { dip *p1=head; char riga[80]; int i; printf("Inserire nome del dipendente:"); gets(riga); while(p1!=NULL && strcmpi(p1->nome,riga)!=0) p1=p1->next; if(p1==NULL) printf("Cojone!\n"); else { for(i=p1->num_prj-1;i>=0;i--) printf("%s\n",p1->punta[i]->progetto); } } void stampa_dip (void) { puntatore *app; char riga[80]; int n; printf("Inserire nome del progetto:"); gets(riga); n=hash(riga); app=progetti[n].primo; while(app!=NULL) { printf("%s\n",app->impiegato->nome); app=app->next; } }