/* Esercitazione di laboratorio numero 2 ------------------------------------ Esercizio 1 ---------- Gestione di liste complesse. Un file contiene le informazioni relative a un gruppo di studenti che hanno sostenuto un determinato esame. Per ciascuno studente il file contiene (su un'unica riga): * il cognome (stringa di al massimo 20 caratteri, e.g., Rossi, Bianchi, etc.) * il voto (valore reale compreso tra 0 e 30, e.g., 15.5, 28, etc.) I dati non sono ordinati in alcun modo prestabilito. Si osservi, inoltre, che il numero di studenti non e' noto a priori. Si scriva un programma C in grado di ricevere ed eseguire ripetutamente ciascuno dei seguenti comandi (così come riportati): * leggi legge il file di nome avente la struttura precedentemente analizzata e ne memorizza il contenuto in una lista concatenata. Non esiste alcuna richiesta sull'ordine di inserzione degli elementi nella lista. * scriviN memorizza la lista nel file di nome con formato analogo a quello definito in precedenza, ma ordinato per nome in maniera lessicografica crescente. Se =="stdout" visualizza il file su video. * scriviV memorizza la lista nel file di nome con formato analogo a quello definito in precedenza, ma ordinato per voto in maniera numerica ascendente. Se =="stdout" visualizza il file su video. * fine termina il programma. VINCOLI E RESTRIZIONI -------------------- Il programma NON deve effettuare un ri-ordinamento dei dati per ciascuna esecuzione dei comandi scriviN e scriviV, bensi' la struttura utilizzata DEVE permettere direttamente l'accesso, e quindi la memorizzazione, delle informazioni con l'ordine richiesto. Questo puo' essere ottenuto mediante una struttura a lista in cui gli elementi posseggono due puntatori. In tale struttura, ciascun elemento appartiene a due liste logicamente separate, ma fisicamente compenetrate: la prima lista, ordinata per nome, si ottiene seguendo il primo dei due puntatori; la seconda lista, ordinata per voto, si ottiene seguendo il secondo puntatore. */ #include #include #include #include "header.h" #define MAX_LEN 20 typedef struct nodo{ char nome[40]; float voto; struct nodo *next; }dato; void add_nodo(dato **head, dato *toadd) { dato *tmp; tmp=*head; if (tmp==NULL) { *head=toadd; return; } while (tmp->next!=NULL) tmp=tmp->next; tmp->next=toadd; return; } void print_lista(dato **lista){ dato *tmp; tmp=*lista; while (tmp!=NULL){ printf("%s\t%f\n",tmp->nome, tmp->voto); tmp=tmp->next; } return; } void leggi(char *file, dato **lista){ FILE *fp; char buf[255],nome[40]; float voto; dato *x; fp = m_fopen(file,"r"); while (!feof(fp)){ fgets(buf,sizeof(buf),fp); sscanf(buf,"%s %f", nome, &voto); x=(dato *)malloc(sizeof(dato)); strncpy(x->nome, nome, sizeof(nome)); x->voto=voto; x->next=NULL; add_nodo (&lista,x); } fclose(fp); print_lista(&lista); return; } int main (void){ char com[MAX_LEN],bus[MAX_LEN]; dato *lista=NULL, *ord_nome=NULL, *ord_voto=NULL; while(1){ printf("sh:~$ "); scanf("%s", com); if (strcmp(com, "exit")==0) exit(0); else scanf("%s", bus); //printf("%s", bus); //printf("%s %s", com, bus); if (strcmp(com, "leggi")==0) leggi(bus,&lista); //if (strcmp(com, "scriviN")==0) scriviN(&lista,&ord_nome); //if (strncmp(com, "scriviV")==0) leggi(bus); else fprintf(stderr, "Command not found.\n"); } //printf("com:%s\nbus:%s\nSei contento???", com, bus); return 0; }