Solução: Problema da moda - dificuldade 5 (Lúcio Ribeiro)

From AdonaiMedrado.Pro.Br
Jump to: navigation, search
// Lúcio Ribeiro
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void erro(char **vet,char *palavra, int i, int caso)
{
	while(i)
	{
		i--;
		free(*(vet+i));
	}
	free(vet);
	if(caso)
		exit(caso);
}
 
int comparar(const void *a ,const void *b)
{
	return strcmp( *(char**)a, *(char**)b );
}
 
 
int main()
{
	char **vet=NULL;
	char *palavra=NULL;
	int k,linha=0,moda=1,cont=1, i,j;
	FILE *arquivo;
 
 
	arquivo = fopen("dif5.txt","r");
 
	do /*ler e alocar*/
	{
		if(fscanf(arquivo,"%d",&k)==EOF)
			break;
		palavra = (char *) realloc(palavra, sizeof(char)*(k+1));
		if(palavra==NULL)
			erro(vet,palavra,linha,1);
		fscanf(arquivo,"%s",palavra);
		linha++;
		vet = (char **) realloc(vet, sizeof(char*)*linha);
		*(vet+linha-1) = (char*) malloc(sizeof(char)*(k+1));
		if(vet==NULL||*(vet+linha-1)==NULL)
			erro(vet,palavra,linha,1);
		strcpy(*(vet+linha-1), palavra);
	}while(1);
 
 
	if(linha==1)/*importantissimo*/
	{
		printf("%s",*vet);
		return 0;
	}
 
 
	qsort(vet,linha,sizeof(char**),comparar);
 
	j=1;
	for(i=1;i<linha;i++)/*definir moda*/
	{
		if(!strcmp(*(vet+i),*(vet+i-1)))
			j++;
		else j=1;
		if(j>moda)
				moda=j;
	}
 
	for(i=1;i<linha;i++)/*imprimir*/
	{
		if(!strcmp(*(vet+i),*(vet+i-1)))
			cont++;
		else
			cont=1;
		if(cont==moda)
			printf("%s\n",*(vet+i));
	}
	erro(vet,palavra,linha,0);
	return 0;
}