#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);
}