/* PROVA D'ESAME 08-06-2022 */ #include #include using namespace std; // STRUTTURE struct elem{ // struttura per la persona char codice[6]; elem* pun; }; struct sportello{ bool aperto; elem* testa; int quanti; }; struct ServizioClienti{ sportello vett[2]; }; // UTILITY bool inCoda(elem* p, const char* id){ for(elem* q = p; q!=NULL; q= q->pun){ if(strcmp(q->codice, id) == 0){return true;} } return false; } void inserisci(ServizioClienti& s, int i, const char* id){ elem* r = new elem; strcpy(r->codice, id); r->pun = NULL; elem* p; elem* q; for(q = s.vett[i].testa; q!=NULL; q= q->pun){ // scorro la lista p=q; } if(q==s.vett[i].testa){ s.vett[i].testa=r; }else{ p->pun = r; } s.vett[i].quanti++; } // FUNZIONI TESTO void InizializzaServizio(ServizioClienti& s){ for(int i=0; i<2; i++){ s.vett[i].aperto=true; s.vett[i].testa=NULL; s.vett[i].quanti=0; } } void richiestaServizio(ServizioClienti& s, const char* id){ if(strlen(id)!=5){ return; } for(int i=0; i<5; i++){ if(!((id[i]>='0' && id[i]<='9')||(id[i]>='A' && id[i]<='Z'))){ return; } } if(!(s.vett[0].aperto) && !(s.vett[1].aperto)){ return; } for(int i=0; i<2; i++){ if(s.vett[i].aperto && inCoda(s.vett[i].testa, id)){ return; } } //va tutto bene, posso inserirlo // entrambi aperti if(s.vett[0].aperto && s.vett[1].aperto){ if(s.vett[0].quanti > s.vett[1].quanti){ inserisci(s, 1, id); }else{ inserisci(s, 0, id); } }else if(s.vett[0].aperto){ inserisci(s, 0, id); }else{ inserisci(s, 1, id); } } bool clienteServito(ServizioClienti& s, int n){ if(n<=0 || n>=3){ return false; } n--; if(!s.vett[n].aperto){ return false;} if(s.vett[n].aperto && s.vett[n].quanti>0){ s.vett[n].quanti--; elem* p = s.vett[n].testa; s.vett[n].testa = p->pun; delete p; return true; } return false; } bool lasciaSportello(ServizioClienti& s, const char* id){ elem *p, *q; for(int i=0; i<2; i++){ if(s.vett[i].aperto && s.vett[i].quanti>0){ for(q=s.vett[i].testa; q!=NULL && strcmp(q->codice, id)!=0; q=q->pun){ p=q; // ti salvi qual รจ il punto } if(q!=NULL){ if(q==s.vett[i].testa){ s.vett[i].testa = q->pun; }else{ p->pun = q->pun; } delete q; s.vett[i].quanti--; return true; } } } return false; } void stampaServizioClienti(ServizioClienti& s){ for(int i=0; i<2; i++){ cout << '[' << i+1 << "] "; for(elem* q= s.vett[i].testa; q!=NULL; q=q->pun){ cout << q->codice; if(q->pun != NULL){ cout << ", "; } } cout << endl; } }