/*
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 <nomeFile> legge il file di nome <nomeFile> 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 <nomeFile> memorizza la lista nel file di nome <nomeFile> con formato
analogo a quello definito in precedenza, ma ordinato per nome in maniera
lessicografica crescente. Se <nomeFile>=="stdout" visualizza il file su video.
* scriviV <nomeFile> memorizza la lista nel file di nome <nomeFile> con formato
analogo a quello definito in precedenza, ma ordinato per voto in maniera
numerica ascendente. Se <nomeFile>=="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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}