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

/*typedef struct {
    char ime[11];
    int godina;
    double stan;
} elementtype;*/

typedef struct _celija {
//    elementtype podatak;
    char ime[11];
    int godina;
    double stan;
    struct _celija *next;
} celija;

typedef struct _lista {
    celija *head,*tail;
} lista;

void makenull(lista *bla) {
    bla->head=(celija *)malloc(sizeof(celija));
    bla->head->next=NULL;
    bla->tail=bla->head;
}

void dodaj(char *ime,int godina,double stan,lista *bla) {
    bla->tail->next=(celija *)malloc(sizeof(celija));
    bla->tail=bla->tail->next;
    strcpy(bla->tail->ime,ime);
    bla->tail->godina=godina;
    bla->tail->stan=stan;
    bla->tail->next=NULL;
}

void ispisi(lista bla) {
    celija *tmp;
    
    tmp=bla.head->next;
    while (tmp!=NULL) {
	printf("  %-10s %d. %7.2lf\n",tmp->ime,tmp->godina,tmp->stan);
	tmp=tmp->next;
    }
}

void obrisi(lista *bla) {
    celija *tmp;

    while (bla->head!=NULL) {
	tmp=bla->head;
	bla->head=bla->head->next;
	free(tmp);
    }
}

int maksimum(char *ime,lista bla) {
    int maks=0;
    celija *tmp;

    tmp=bla.head->next;
    while (tmp!=NULL) {
	if (strcmp(tmp->ime,ime)==0 && tmp->godina>maks) maks=tmp->godina;
	tmp=tmp->next;
    }

    return maks;
}

void sortiraj(lista *bla) {
    celija *i,*j;
    char ime[11];
    int godina;
    double stan;

    for(i=bla->head->next;i!=bla->tail;i=i->next)
	for (j=i->next;j!=NULL;j=j->next)
	    if (i->stan<j->stan) {
		strcpy(ime,i->ime);
		godina=i->godina;
		stan=i->stan;
		strcpy(i->ime,j->ime);
		i->godina=j->godina;
		i->stan=j->stan;
		strcpy(j->ime,ime);
		j->godina=godina;
		j->stan=stan;
	    }
}		
    
int main(void) {
    char datoteka[16],ime[11];
    FILE *in;
    lista zemlje;
    int godina;
    double stan;
    celija *i,*tmp;

    printf("Unesite ime ulazne datoteke: ");
    scanf("%s",datoteka);
    
    if ((in=fopen(datoteka,"r"))==NULL) {
	printf("Grjeska pri otvaranju datoteke %s!\n",datoteka);
	return 1;
    }

    makenull(&zemlje);
    
    while (!feof(in)) {
	fscanf(in,"%s %d %lf\n",ime,&godina,&stan);
	dodaj(ime,godina,stan,&zemlje);
    }
    
    printf("  Zemlja     God.  stanovn.\nSvi podatci:\n");
    ispisi(zemlje);

    // ciscenje liste
    for (i=zemlje.head;i!=zemlje.tail;)
	if (i->next->godina!=maksimum(i->next->ime,zemlje)) {
	    tmp=i->next;
	    i->next=i->next->next;
	    free(tmp);
	}
	else i=i->next;

    printf("Najnoviji podatci:\n");
    ispisi(zemlje);

    sortiraj(&zemlje);

    printf("Sortirano:\n");
    ispisi(zemlje);

    obrisi(&zemlje);
    fclose(in);
    return 0;
}
