#include<stdio.h>
#include<stdlib.h>
#define MAXSTR 9 /* considero anche carattere fine stringa */
struct lista_gruppi{
char gruppo[MAXSTR];
struct lista_gruppi *next;
};
struct lista_utenti{
char utente[MAXSTR];
struct lista_gruppi *gruppi; /* gruppi a cui appartiene questo studente */
struct lista_utenti *next;
};
/* inserimento in testa nella lista gruppi */
struct lista_gruppi *inserisci_gruppo(struct lista_gruppi *h, char *gruppo){
struct lista_gruppi *a;
a=malloc(sizeof(struct lista_gruppi));
a->next=h;
strcpy(a->gruppo,gruppo);
return a;
}
/* inserimento utente o comunque gruppo a cui appartiene */
struct lista_utenti *salva_in_lista(struct lista_utenti *h, char *gruppo, char* utente){
/* primo caso la lista e' vuota */
if(!h){
h=malloc(sizeof(struct lista_utenti));
h->next=NULL;
h->gruppi=NULL;
strcpy(h->utente,utente);
h->gruppi=inserisci_gruppo(h->gruppi,gruppo);
return h;
}
/* secondo caso avevo gia' inserito l'utente */
if(!strcmp(h->utente,utente)){
h->gruppi=inserisci_gruppo(h->gruppi,gruppo);
return h;
}
/* devo cercare oltre */
h->next=salva_in_lista(h->next,gruppo,utente);
return h;
}
/* funzione che stampa la lista gruppi */
void stampa_gruppi(struct lista_gruppi *h){
if(!h) return;
printf(" %s\n",h->gruppo);
stampa_gruppi(h->next);
}
/* funzione che stampa utenti e relativi gruppi */
void stampa_il_tutto(struct lista_utenti *h){
if(!h)return;
printf("Utente: %s\nGruppi a cui appartiene:\n",h->utente);
stampa_gruppi(h->gruppi);
printf("\n");
stampa_il_tutto(h->next);
}
/************************* funzione MAIN ******************************/
int main(int argc, char **argv){
char gruppo[MAXSTR],utente[MAXSTR];
FILE *inf;
int ii;
char c;
struct lista_utenti *lista=NULL;
if((inf=fopen("gruppi","r"))==NULL){
fprintf(stderr,"Errore in apertura file\n");
exit(EXIT_FAILURE);
}
/* ciclo finche non leggo tutto il file */
while(!feof(inf)){
/*leggo il gruppo*/
ii=0;
ii=fscanf(inf,"%[^#]#",gruppo);
if(ii!=1) /* se non sono ruiscito a leggere il gruppo esco dal ciclo */
break;
/* lettura utente */
ii=0;
do{
c=getc(inf);
/* se incontro , ho finito lettura utente */
if((c==',')||(c=='\n')){
utente[ii]='\0'; /*termino stringa*/
lista=salva_in_lista(lista,gruppo,utente);
ii=0;
continue;
}
/* memorizzo carattere letto e avanzo */
utente[ii++]=c;
}while(c!='\n');
}
fclose(inf);
stampa_il_tutto(lista);
}