- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #define MAXG 3
- #define MAXM 21
- typedef struct MESO
- {
- char grad[MAXG];
- char meso[MAXM];
- float cena;
- struct MESO *sledeci;
- }MESO;
- 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(MESO **glava)
- {
- *glava=NULL;
- }
- MESO *KreirajCvor(char grad[],char meso[],int cena)
- {
- MESO *novi=(MESO *)malloc(sizeof(MESO));
- if(novi==NULL)
- {
- printf("Nema dovoljno RAM-a");
- exit(21);
- }
- strcpy(novi->grad,grad);
- strcpy(novi->meso,meso);
- novi->cena=cena;
- novi->sledeci=NULL;
- return novi;
- }
- void SpojiCvor(MESO **glava,MESO *novi)
- {
- if(*glava==NULL)
- {
- *glava=novi;
- return;
- }
- int nakraj=1;
- MESO *tek,*pret;
- tek=*glava;
- pret=*glava;
- if(novi->cena<tek->cena)
- {
- novi->sledeci=*glava;
- *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 KreirajListu(MESO **glava,FILE *ulaz)
- {
- char grad[MAXG];
- char meso[MAXM];
- float cena;
- while(fscanf(ulaz,"%s %s %f",grad,meso,&cena)!=EOF)
- {
- MESO *novi=KreirajCvor(grad,meso,cena);
- SpojiCvor(glava,novi);
- }
- }
- void SacuvajListu(FILE *izlaz,MESO *glava)
- {
- if(glava!=NULL)
- {
- fprintf(izlaz,"%.2f %s %s\n",glava->cena,glava->grad,glava->meso);
- SacuvajListu(izlaz,glava->sledeci);
- }
- }
- void NajpovoljnijeMeso(MESO *glava,char meso[],FILE *izlaz)
- {
- if(glava==NULL)
- {
- printf("Lista je prazna");
- return;
- }
- MESO *naj=NULL;
- while(glava!=NULL)
- {
- if(strcmp(glava->meso,meso)==0)
- {
- if(naj==NULL)
- {
- naj=glava;
- }
- else if(glava->cena<naj->cena)
- {
- naj=glava;
- }
- }
- glava=glava->sledeci;
- }
- if(naj==NULL)
- {
- fprintf(izlaz,"Ne postoji meso: %s",meso);
- }
- else
- {
- fprintf(izlaz,"Najpovoljnija %s je:\n%.2f %s %s ",meso,naj->cena,naj->grad,naj->meso);
- }
- }
- void UnistiListu(MESO **glava)
- {
- if(*glava!=NULL)
- {
- UnistiListu(&((*glava)->sledeci));
- free(*glava);
- *glava=NULL;
- }
- }
- int main(int brArg,char *Arg[])
- {
- MESO *glava;
- if(brArg!=4)
- {
- printf("Niste uneli odgovarajuc broj argumenata");
- exit(42);
- }
- char *ulaz_ime=Arg[2];
- FILE *ulaz=SafeOpen(ulaz_ime,"r",1);
- char *izlaz_ime=Arg[3];
- FILE *izlaz=SafeOpen(izlaz_ime,"w",2);
- Inicijalizacija(&glava);
- KreirajListu(&glava,ulaz);
- SacuvajListu(izlaz,glava);
- NajpovoljnijeMeso(glava,Arg[1],izlaz);
- UnistiListu(&glava);
- fclose(ulaz);
- fclose(izlaz);
- return 0;
- }