//Lorenzini Alessandro //Programma di gestione LISTA //librerie #include #include #include //costanti #define N 30 //variabili globali struct elementi { int nr; char cognome[N]; char nome[N]; struct elementi *prec; struct elementi *succ; }; struct elementi dato; struct elementi *nuovo; struct elementi *testa; struct elementi *corrente; struct elementi *eliminato; struct elementi *prima; struct elementi *dopo; int gb; //grandezza elemento int gp; //grandezza puntatore //procedure globali int menu() { int scelta; //visualizzazione menu printf("\nGESTIONE LISTA\n"); printf("1. Visualizzazione\n"); printf("2. Inserimento\n"); printf("3. Eliminazione\n"); printf("4. Carica dati\n"); printf("5. Salva dati\n"); printf("0. Fine Sessione\n"); printf("Scelta: "); scanf("%d", &scelta); getchar(); return (scelta); }//menu void inizializzazione() { testa = NULL; gb = sizeof(struct elementi); gp = sizeof(struct elementi *); }//inizializzazione void visualizzazione() { corrente = testa; if(corrente==NULL) printf("LISTA vuota!!\n"); while(corrente!=NULL) { printf("%3d ", corrente->nr); printf("%s ", corrente->cognome); printf("%s\n", corrente->nome); corrente = corrente->succ; } }//visualizzazione void inserimento() { //creo il nuovo elemento nuovo=(struct elementi *)malloc(sizeof(struct elementi)); //inserisco i dati nell'elemento printf("Numero registro: "); scanf("%d", &(nuovo->nr)); printf("Cognome: "); scanf("%s", nuovo->cognome); nuovo->cognome[29]='\0'; printf("Nome: "); scanf("%s", nuovo->nome); nuovo->nome[29]='\0'; nuovo->prec = NULL; nuovo->succ = NULL; //inserisco l'elemento nella LISTA //controllo se ci sono elementi if(testa==NULL) { testa = nuovo; } else { if(testa->nr > nuovo->nr) { //inserisco in testa alla lista nuovo->succ = testa; testa->prec = nuovo; testa = nuovo; } else { //ricerco la posizione prima = NULL; dopo = testa; while(dopo!=NULL && dopo->nrnr) { prima = dopo; dopo = dopo->succ; } if(dopo!=NULL) { //inserisco in posizione interna alla lista nuovo->succ = dopo; nuovo->prec = prima; prima->succ = nuovo; dopo->prec = nuovo; } else { //inserisco in coda alla lista nuovo->prec = prima; prima->succ = nuovo; } } } }//inserimento void eliminazione() { eliminato = testa; if(eliminato!=NULL) { //elimino dalla testa printf("Elimino dalla LISTA\n"); printf("%3d ", eliminato->nr); printf("%s ", eliminato->cognome); printf("%s\n", eliminato->nome); //sposto testa all'elemento successivo testa = testa->succ; free(eliminato); } else printf("LISTA vuota!! Impossibile eliminare!!\n"); }//eliminazione void carica() { FILE *fl; fl=fopen("registro.dat","rb"); if(fl==NULL) printf("\nErrore di apertura file registro.dat\n"); else { //leggo il file da cima a fondo while(fread(&dato,gb,1,fl)!=0) { //creo il nuovo elemento nuovo=(struct elementi *)malloc(sizeof(struct elementi)); //inserisco i dati nell'elemento nuovo->nr = dato.nr; strcpy(nuovo->cognome,dato.cognome); strcpy(nuovo->nome,dato.nome); nuovo->succ = NULL; //inserisco l'elemento nella pila nuovo->succ = testa; testa = nuovo; } fclose(fl); } }//carica void salva() { FILE *fs; fs = fopen("registro.dat","ab"); if(fs==NULL) printf("\nErrore di apertura file registro.dat\n"); else { //salvo nel file l'intera coda corrente = testa; if(corrente==NULL) printf("LISTA vuota!!\n"); while(corrente!=NULL) { fwrite(corrente,gb,1,fs); corrente=corrente->succ; } fclose(fs); } } void contaelementi() { int nr=0; corrente = testa; while(corrente!=NULL) { nr++; corrente = corrente->succ; } printf("Nella LISTA sono presenti %d elementi.\n",nr); }//contaelementi void ricercanr() { int nr; int flag=0; printf("Ricerca elemento per N° registro: \n"); scanf("%d",&nr); getchar(); corrente = testa; if(corrente==NULL) printf("LISTA vuota!!\n"); else { while(corrente!=NULL && flag==0) { if(corrente->nr == nr) { printf("%3d ", corrente->nr); printf("%s ", corrente->cognome); printf("%s\n", corrente->nome); flag=1; } corrente = corrente->succ; } if(flag==0) printf("Elemento non trovato nella LISTA!!\n"); } }//ricercanr void ricercacognome() { char cognome[N]; int flag=0; printf("Ricerca elemento per Cognome: \n"); scanf("%s",cognome); getchar(); corrente = testa; if(corrente==NULL) printf("LISTA vuota!!\n"); else { while(corrente!=NULL && flag==0) { if(strcmp(corrente->cognome,cognome)) { printf("%3d ", corrente->nr); printf("%s ", corrente->cognome); printf("%s\n", corrente->nome); flag=1; } corrente = corrente->succ; } if(flag==0) printf("Elemento non trovato nella LISTA!!\n"); } }//ricercacognome //principale int main() { //inizializzazione inizializzazione(); //programma int scelta; do { scelta=menu(); switch(scelta) { case 0: printf("Fine Sessione\n"); break; case 1: visualizzazione(); break; case 2: inserimento(); break; case 3: eliminazione(); break; case 4: carica(); break; case 5: salva(); break; case 6: contaelementi(); break; case 7: ricercanr(); break; case 8: ricercacognome(); break; default: printf("Scelta errata!!\n"); break; }//switch }while(scelta!=0); return 0; }//main