#include #include #include #define MAXD 4 #define MAXG 3 #define MAXP 21 typedef struct PIZZA { float cena; char drzava[MAXD]; char grad[MAXG]; char pizza[MAXP]; struct PIZZA *sledeci; }PIZZA; FILE *SafeOpen(char Ime[],char Mod[],int error) { FILE *fp=fopen(Ime,Mod); if(fp==NULL) { printf("Nije moguce otvoriti datoteku"); exit(error); } return fp; } void Inicijalizacija(PIZZA **glava) { *glava=NULL; } PIZZA *KreirajCvor(float cena,char drzava[],char grad[],char pizza[]) { PIZZA *novi=(PIZZA *)malloc(sizeof(PIZZA)); if(novi==NULL) { printf("Nema dovoljno RAM-a"); exit(21); } novi->cena=cena; strcpy(novi->drzava,drzava); strcpy(novi->grad,grad); strcpy(novi->pizza,pizza); novi->sledeci=NULL; return novi; } void SpojiCvor(PIZZA **glava,PIZZA *novi) { if(*glava==NULL) { *glava=novi; return; } int nakraj=1; PIZZA *tek,*pret; tek=*glava; pret=*glava; if(novi->cenacena) { novi->sledeci=tek; *glava=novi; return; } while(tek!=NULL) { if(novi->cenacena) { nakraj=0; break; } pret=tek; tek=tek->sledeci; } if(nakraj==1) { pret->sledeci=novi; } else { novi->sledeci=tek; pret->sledeci=novi; } } void Ucitaj(PIZZA **glava,FILE *ulaz) { float cena; char drzava[MAXD]; char grad[MAXG]; char pizza[MAXP]; while(fscanf(ulaz,"%f %s %s %s",&cena,drzava,grad,pizza)!=EOF) { PIZZA *novi=KreirajCvor(cena,drzava,grad,pizza); SpojiCvor(glava,novi); } } void SacuvajListu(PIZZA *glava,FILE *izlaz) { if(glava!=NULL) { fprintf(izlaz,"%.2f %s %s %s\n",glava->cena,glava->drzava,glava->grad,glava->pizza); SacuvajListu(glava->sledeci,izlaz); } } void ProsecnaCena(PIZZA *glava,FILE *izlaz,char drzava[],char pizza[]) { if(glava==NULL) { printf("Lista je prazna"); return; } int br=0; int sum=0; float S; while(glava!=NULL) { if(strcmp(glava->drzava,drzava)==0 && strcmp(glava->pizza,pizza)==0) { br++; sum+=glava->cena; } glava=glava->sledeci; } S=(float)sum/br; fprintf(izlaz,"Prosecna cena %s iz %s je:\n%.2f",pizza,drzava,S); } void UnistiListu(PIZZA **glava) { if(*glava!=NULL) { UnistiListu(&((*glava)->sledeci)); free(*glava); *glava=NULL; } } int main(int brArg,char *Arg[]) { PIZZA *glava; if(brArg!=5) { printf("Niste uneli odgovarajuc broj argumenata"); exit(42); } char *ulaz_ime=Arg[3]; FILE *ulaz=SafeOpen(ulaz_ime,"r",1); char *izlaz_ime=Arg[4]; FILE *izlaz=SafeOpen(izlaz_ime,"w",2); Inicijalizacija(&glava); Ucitaj(&glava,ulaz); SacuvajListu(glava,izlaz); ProsecnaCena(glava,izlaz,Arg[1],Arg[2]); UnistiListu(&glava); fclose(ulaz); fclose(izlaz); return 0; }