void inserir_palavra(Parvore *node, int size, char *palavra){ int i; if(*node == NULL){ *node = (Arvore *)malloc(sizeof(Arvore)); for(i = 0; i < TAMANHO; i++) (*node)->v[i] = NULL; if(palavra[0] != '\0'){ inserir_palavra(&(*node)->v[palavra[0] - 'a'], size, palavra + 1); (*node)->flag = 0; } else{ (*node)->flag = 1; (*node)->palavra = malloc(size); strcpy((*node)->palavra, palavra - size); } } else{ if(palavra[0] != '\0'){ inserir_palavra(&(*node)->v[palavra[0] - 'a'], size, palavra + 1); } else{ (*node)->flag = 1; (*node)->palavra = malloc(size); strcpy((*node)->palavra, palavra - size); } } }
/* ler, gravar os dados do arquivo a uma lista de palavras * *@param Char const *nome_arq - referencia do arquivo a ser lido * *@return Struct Lista_palavras - retorna uma nova lista de palavras */ struct lista_palavras * carregar_palavras(char const * nome_arq) { // Abre um arquivo para leitura FILE * arq = fopen(nome_arq, "r"); if (arq == NULL) { printf("O arquivo indicado não pode ser aberto.\n"); exit(!0); } // Le quantas palavras há no arquivo aberto unsigned int num_palavras; if (fscanf(arq, "%u\n", &num_palavras) == 0) { printf("Erro ao ler quantidade de palavras no arquivo.\n"); exit(!0); } // Cria uma nova lista de palavras struct lista_palavras * lista = nova_lista(num_palavras); for (int i = 0; i < num_palavras && feof(arq) == 0; i++) { const int tam_max_palavra = 100; char palavra[tam_max_palavra]; /*exercicio 4 ->adicionado */ char *palavras; palavras = fgets(palavra,tam_max_palavra,arq); palavras[strlen(palavra) -1] = '\0'; /*exercico4 */ /* if(fscanf(arq, "%s\n",palavra) == 0) { printf("Erro ao ler a proxima palavra do arquivo %s.\n",palavra); liberar_lista_palavras(lista); exit(!0); }*/ inserir_palavra(lista,palavra); } return lista; }
int main(int argc, char *argv[]){ FILE *arquivo1, *arquivo2; Parvore arvore; PLista lista, lista2, lista3, p, z, y; char carac_text, carac_dicio; char word[2000000]; char word_text[2000000]; char other_word[2000000]; int i = 0, tam = 0, j = 0, lines = 1, k; inicializaArvore(&arvore); inicializaLista(&lista); inicializaLista(&lista2); inicializaLista(&lista3); arquivo1 = fopen(argv[1], "r"); arquivo2 = fopen(argv[2], "r"); //PEGANDO TODAS AS PALAVRAS DO DICIONARIO E INSERINDO NA ARVORE TRIE while((carac_dicio = fgetc(arquivo1)) != EOF){ if(carac_dicio != '\n'){ word[i] = carac_dicio; i++; } else{ word[i] = '\0'; i = 0; inserir_palavra(&arvore, strlen(word), word); } } //LENDO E TRATANDO TODOS OS CARACTERES DO ARQUIVO2 while((carac_text = fgetc(arquivo2)) != EOF) tam++; //criando string com todo o conteudo do texto char string[tam]; rewind(arquivo2); i = 0; while((carac_text = fgetc(arquivo2)) != EOF){ string[i] = carac_text; i++; } string[i] = '\0'; //o texto todo esta nessa string i = 0; for(j = 0; j < tam; j++){ if((seekChar(separadores,string[j])) && (i == 0)){ //j++; continue; } if(seekChar(separadores, string[j])){ word_text[i] = '\0'; strcpy(other_word,word_text); i = 0; for(k = 0; k < strlen(word_text); k++) word_text[k] = tolower(word_text[k]); if(buscar_palavra(arvore, word_text) == 1){ inserir_crescente(&lista, word_text); } else{ inserir_final(&lista2, other_word); } } else{ word_text[i] = string[j]; i++; } } i = 0; for(p = lista; (p != NULL); p = p->prox){ int aux = 1; int number; printf("%s", p->palavra); for(j = 0; j < tam; j++){ if(seekChar(separadores, string[j])){ word_text[i] = '\0'; i = 0; for(k = 0; k < strlen(word_text); k++) word_text[k] = tolower(word_text[k]); if((strcmp(word_text,p->palavra)) == 0){ if (lines != number){ if(aux == 1){ printf(" %d", lines); number = lines; } else{ printf(", %d", lines); number = lines; } aux = 0; } } if(string[j] == '\n'){ lines++; number = lines-1; } } else{ word_text[i] = string[j]; i++; } } printf("\n"); lines = 1; } //imprimir(lista2); for(z = lista2; (z != NULL); z = z->prox){ printf("%s ", z->palavra); //for(y = lista3; (y != NULL); y = y->prox){ buscarMenor(arvore, z->palavra); printf("%s\n", menorpalavra); menorpalavra[0] = '\0'; menor = 100; } }