Obs.: o código segue abaixo:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef
struct node node;
typedef
node *arvore;
typedef
node *posicao;
struct
node{
char letra;
int cont;
node *filhos[26];
};
/***********************************
char minuscula(char c){
if(c >= 'A' && c <= 'Z')
c = c - 'A' + 'a';
return c;
}
/***********************************
int
numero(char c){
return (c - 'a');
}
/***********************************
void ordem(arvore tree, char palavra[1000], arvore princ,
FILE *saida){
node *c;
int tamanho;
tamanho =
strlen(palavra);
if(tree->letra
!= 'D'){
palavra[tamanho] = tree->letra;
palavra[tamanho+1] = '\0';
}
if(tree->cont
> 0 && palavra[0] != 'D')
fprintf(saida,
"%d %s\n", tree->cont, palavra);
c =
tree->filhos[0];
for(int i = 1; i < 26; i++){
if(c != NULL)
ordem(c,
palavra, princ, saida);
c =
tree->filhos[i];
palavra[tamanho+1] = '\0';
if(tree == princ)
palavra[0] = '\0';
}
}
/***********************************
int main(){
arvore principal, aux;
FILE *entrada, *saida;
char carac;
int posic;
entrada = fopen("entrada.txt",
"r");
saida = fopen("saida.txt",
"w");
principal = (arvore)malloc(sizeof(node));
for(int i = 0; i < 26; i++)
principal->filhos[i] = NULL;
principal->letra
= 'D';
principal->cont
= 0;
aux = principal;
while((fscanf(entrada, "%c", &carac)) > 0){
if((carac
>= 'a' && carac <= 'z') || (carac >= 'A' && carac
<= 'Z')){ //sabe se eh letra ou nao
carac =
minuscula(carac);
posic =
numero(carac);
if(aux->filhos[posic] == NULL){
aux->filhos[posic] = (arvore)malloc(sizeof(node)); //aloca espaco para "novas" letras
aux->filhos[posic]->letra = carac;
aux->filhos[posic]->cont = 0;
for(int i = 0; i < 26; i++)
aux->filhos[posic]->filhos[i] = NULL;
}
aux =
aux->filhos[posic];
}
else{
if(aux !=
principal)
aux->cont++;
aux=principal;
}
}
char palavra[1000];
strcpy(palavra,
"\0");
ordem(principal,
palavra, principal, saida); //funcao q le e imprime a arvore
fclose(entrada);
fclose(saida);
return 0;
}
Nenhum comentário:
Postar um comentário