This is already accepted, though I've a problem optimizing it.
Code: Select all
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct country
{
char name[80];
int count;
};
void update(struct country arr[], char country[]);
void print(struct country arr[]);
void initialize(struct country arr[]);
int compar(const void * p1, const void * p2);
int main()
{
struct country arr[2000] = {};
initialize(arr);
char str[80];
fgets(str,80,stdin);
int n;
sscanf(str,"%d",&n);
int i;
for(i=0; i<n; i++)
{
fgets(str,80,stdin);
char country[80];
sscanf(str,"%s",country);
update(arr,country);
}
//print(arr);
qsort(arr,2000,sizeof(struct country),compar);
//printf("blablalbalab\n");
print(arr);
return 0;
}
void update(struct country arr[], char country[])
{
int i;
for(i=0; i<2000; i++)
{
if(!arr[i].count)
{
arr[i].count = 1;
strcpy(arr[i].name,country);
break;
}
if(!strcmp(arr[i].name, country))
{
arr[i].count++;
break;
}
}
}
void print(struct country arr[])
{
int i;
for(i=0;i<2000;i++)
{
if(!(arr[i].count))
continue;
printf("%s %d\n",arr[i].name,arr[i].count);
}
}
void initialize(struct country arr[])
{
int i;
for(i=0;i<2000;i++)
{
strcpy(arr[i].name,"");
arr[i].count = 0;
}
}
int compar(const void * p1, const void *p2)
{
//printf("%d\n",((struct country *)p1)->count);
//printf("%d\n",(*((struct country *)p1)).count);
/*
if((*((struct country *)p1)).count == 0)
return 1;
if((*((struct country *)p2)).count == 0)
return 1;
*/
return strcmp((*((struct country *)p1)).name, (*((struct country *)p2)).name);
}
It goes like:
0
0
0
somecountry
0
0
0
anothercountry
0
0
whereas I want it to be
somecountry
anothercountry
0
0
0
...