- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #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->cena<tek->cena)
- {
- novi->sledeci=tek;
- *glava=novi;
- return;
- }
- while(tek!=NULL)
- {
- if(novi->cena<tek->cena)
- {
- 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;
- }