/* soluzione compito Fondamenti di Informatica (Amb. & Territorio) 29-1-99 */

#include <stdio.h>
#include <stdlib.h>

#define FILE_ESTRAZ "ESTRAZ.TXT"
#define FILE_AMBI "AMBI.TXT"
#define LIMITE 10.30

struct el {
	int cod_ric;
	float giocate;
	struct el *next;
};

typedef struct el elem;

/* prototipi */
FILE *ApriFile(char *, char *);
void InserisciGiocata(int, float, elem **);
int Mono(int, int[5 ]);
int Ambo(int, int, int[5 ]);
elem *CostruisciListaVincite(int);
void EliminaElemento(elem *, elem **);
void SfoltisciListaVincite(elem **);
void StampaLista(elem *);
int main(void);

FILE *ApriFile(char *nomefile, char *modo)
{
	FILE *f;
	f=fopen(nomefile,modo);
	if(f==NULL) {
		printf("Errore apertura file %s in modalita` %s. Programma terminato.\n",nomefile,modo);
		exit(1);
	}
	return f;
}

void InserisciGiocata(int ric, float importo, elem **testa)
{
	elem *cursore, *prec, *nuovo;
	
	/* cerca prima se la ricevitoria e` gia` in lista */
	cursore=*testa;
	while((cursore!=NULL)&&(cursore->cod_ric!=ric)) {
		prec=cursore;
		cursore=cursore->next;
	}
	if(cursore!=NULL) /* ricevitoria in lista */
		cursore->giocate=cursore->giocate+importo;
	else { /* ricevitoria non in lista, la inserisco */
		nuovo=malloc(sizeof(elem));
		nuovo->cod_ric=ric;
		nuovo->giocate=importo;
		nuovo->next=NULL;
		if(*testa==NULL)
			*testa=nuovo;
		else
			prec->next=nuovo;
	}
	return;
}


int Mono(int numero, int ruota[5])
/* restituisce 1 se e solo se numero e` presente nella ruota */
{
	int j;
	for(j=0; j<5; j=j+1)
		if(ruota[j]==numero)
			return 1;
	return 0;
}

int Ambo(int a, int b, int ruota[5])
/* restituisce 1 se e solo se (a,b) e` un ambo sulla ruota  */
{
	return Mono(a,ruota)&&Mono(b,ruota);
}

elem *CostruisciListaVincite(int cod_estr)
/* richiesta al punto 1.2 */
{
	FILE *estr, *ambi;
	int E[10][5], a, b, cod, ric, i, j, ruota, letti;
	float importo;
	elem *vincite;
	
	estr=ApriFile(FILE_ESTRAZ,"r");
	ambi=ApriFile(FILE_AMBI, "r");
	
	/* cerca prima in FILE_ESTRAZ l'estrazione cod_estr (parametro) */
	do
		if(fscanf(estr,"%d",&cod)==EOF) {
			printf("Il file %s non contiene l'estrazione di codice %d.\n",FILE_ESTRAZ,cod_estr);
			fclose(estr);
			fclose(ambi);
			return NULL;
		}
	while(cod!=cod_estr);
	
	/* legge nella matrice E l'intera estrazione*/
	for(i=0; i<10; i=i+1)
		for(j=0; j<5; j=j+1)
			fscanf(estr,"%d",&E[i][j]);
			
	vincite=NULL;
	
	while (1) { /* si uscira` dal ciclo tramite break */
		letti=fscanf(ambi,"%d%d%d%d%d%f",&ric,&cod,&ruota,&a,&b,&importo);
		if(letti==EOF)
			break;
		if(letti!=6) {
			printf("Errore formato file %s. Programma terminato.\n",FILE_AMBI);
			exit(2);
		}
		if(cod==cod_estr) {
			if(Ambo(a,b,E[ruota-1]))
				InserisciGiocata(ric,importo,&vincite);
		}
	}
	fclose(estr);
	fclose(ambi);
	return vincite;
}


void EliminaElemento(elem *prec, elem **testa)
{
	elem *morituro;
	if(prec==NULL) {
		morituro=*testa;
		*testa=(*testa)->next;
	} else {
		morituro=prec->next;
		prec->next=morituro->next;
	}
	free(morituro);
	return;
}
		


void SfoltisciListaVincite(elem **testa)
/* richiesta al punto 1.3 */
{
	elem *cursore, *prec;
	prec=NULL;
	cursore=*testa;
	while(cursore!=NULL)
		if(cursore->giocate<LIMITE) {
			cursore=cursore->next;
			EliminaElemento(prec,testa);
		} else {
			prec=cursore;
			cursore=cursore->next;
		}
	return;
}

void StampaLista(elem *primo)
{
	while(primo!=NULL) {
		printf("Ricevitoria %4d, somma importi: %6.2f\n",primo->cod_ric,primo->giocate);
		primo=primo->next;
	}
	printf("\n");
	return;
}

main(void)
{
	elem *listavincite;
	int cod;
	printf("Inserire cod. estrazione: ");
	scanf("%d",&cod);
	listavincite=CostruisciListaVincite(cod);
	StampaLista(listavincite);
	SfoltisciListaVincite(&listavincite);
	StampaLista(listavincite);
	return 0;
}