int InsereAVL(struct No ** noRaiz, struct Item I) { int resultado; if (*noRaiz == NULL) { struct No * NovoNo = CriaNo(I); if (NovoNo == NULL) { return 0; } *noRaiz = NovoNo; return 1; } struct No * noAtual = * noRaiz; if (ChaveMenor(GetChave(I), GetChave(noAtual->I))) { if ((resultado = InsereAVL(&(noAtual->esquerda), I)) == 1) { if (FatorDeBalanceamentoDoNo(noAtual) >= 2) { if ( ChaveMenor(GetChave(I), GetChave((*noRaiz)->esquerda->I))) { RotacaoSimplesADireita(noRaiz); } else { RotacaoDuplaADireita(noRaiz); } } } } else { if ((resultado = InsereAVL(&(noAtual->direita), I)) == 1) { if (FatorDeBalanceamentoDoNo(noAtual) >= 2) { if ( ChaveMenor(GetChave( (*noRaiz)->direita->I ), GetChave(I))) { RotacaoSimplesAEsquerda(noRaiz); } else { RotacaoDuplaAEsquerda(noRaiz); } } } } noAtual->altura = maior( RecuperaAlturaNo(noAtual->esquerda), RecuperaAlturaNo(noAtual->direita) ) + 1; return resultado; }
pNodoA* InsereAVL (pNodoA *a, char x[], int *ok, int linha) { /* Insere nodo em uma árvore AVL, onde A representa a raiz da árvore, x, a chave a ser inserida e h a altura da árvore */ if (a == NULL) { a = (pNodoA*) malloc(sizeof(pNodoA)); strcpy(a->palavra,x); a->esq = NULL; a->dir = NULL; a->FB = 0; a->linhas = cria_lista(); *ok = 1; } if (strcmp(a->palavra,x) == 0) //Sao iguais as palavras, soma mais uma informação de que linha foi encontrada { InfoNo dados; dados.list = linha; a->linhas = insereLSE(a->linhas, dados); } else{ if (strcmp(a->palavra,x) > 0) { a->esq = InsereAVL(a->esq,x,ok,linha); if (*ok) { switch (a->FB) { case -1: a->FB = 0; *ok = 0; break; case 0: a->FB = 1; break; case 1: a=Caso1(a,ok); break; } } } if((strcmp(a->palavra,x) < 0)) { // printf("Foi pra direita -> Palavra: %s", a->palavra); a->dir = InsereAVL(a->dir,x,ok,linha); if (*ok) { switch (a->FB) { case 1: a->FB = 0; *ok = 0; break; case 0: a->FB = -1; break; case -1: a = Caso2(a,ok); break; } } } } return a; }
int main(int argc, char *argv[] ) //argc eh um inteiro que conta quantos parametros foram passados pela linha de comando *Comentarios feitos pela prória professora no arquivo exemplo * //argv guarda o texto dos parametros, argv[1] eh o primeiro parametro, argv[2] eh o segundo paramento, etc *Comentarios feitos pela prória professora no arquivo exemplo * { char palavra[100] = ""; //Para armazenar cada palavra do texto individualmente antes de chamar a funcao char p_consulta[100] = ""; FILE *texto, *consulta, *saida; pNodoA *arv = NULL; int k =0, ok,contador_linha=0; char c; setlocale(LC_ALL,""); //para imprimir corretamente na tela os caracteres acentuados *Comentarios feitos pela prória professora no arquivo exemplo * if (argc != 4) { printf("Numero incorreto de parametros.\n Sintaxe: copia arq_origem arq_destino\n Argumentos: %d" , argc); return 1; } else { texto = fopen (argv[1], "r"); // Abre para ler o arquivo do livro alienista consulta = fopen (argv[2],"r"); //Abre arquivo de consulta, em que terá as palavras consultadas na arvore gerada saida = fopen (argv[3],"w"); // Cria aqruivo de saida, que terá os resultados de todas as palavras pesquisadas com as linhas em que foram encontradas if (texto == NULL || consulta == NULL || saida == NULL) { printf("Arquivo nao encontrado.\n"); return 1; } else { contador_linha = 1; /*Foi feita a leitura caracter a caracter, para poder obter palavra por palavra, usando cpomo referencia, espaços ou pontuações para saber que cada palavra terminou e então adiciona-la a estrutura de dados */ while((c = fgetc(texto))!= EOF) { if(c == '\n' ) //Se for Enter conta uma linha { contador_linha++; //Contador de linha, que é enviado para a função que faz a inserção das palavras na arvore avl, para ionserir as linhas em que a palavra foi encontrada } if(c == ' ' || c == ',' || c == '.' || c == ';'|| c == '?'|| c == '!' || c == '\n' || c == '-' || c == '*' || c == '/' || c == '*'|| c == ':'|| c == '|' || c == '(' || c == ')' || c == ')' || c == '_'|| c == '['|| c == ']' || c == '=' || c == '"' || c == '\t' || c == '>' || c == '<' || c == '+' || c == '{' || c == '}' ) { palavra[k] = '\0'; strlwr(palavra); //Transforma a string em minuscula, já que não é para ter diferenciação de maiusculas e minusculas printf("%s ",palavra); arv = InsereAVL(arv, palavra,&ok,contador_linha); k=0; palavra[k]= '\0'; //Zera a string, para estar vazia para a proxima palavra } else //Se não tiver nenhuma pontuação ou espaço, adiciona mais esse caracter no vetor de caracteres (string) { palavra[k] = c; k++; } } /* Usado para inserir ultima palavra caso não tenha um ENTER ou espaço nela*/ palavra[k] = '\0'; strlwr(palavra); //Transforma a string em minuscula, já que não é para ter diferenciação de maiusculas e minusculas printf("%s ",palavra); arv = InsereAVL(arv, palavra,&ok,contador_linha); k=0; palavra[k]= '\0'; //Zera a string, para estar vazia para a proxima palavra printf ("\n"); k=0; //Zera k, para poder ser usado agora na leitura do arquivo de consulta clock_t start = clock(); //Inicia relogio, para poder ter o tempo que leva para a consulta clock_t diff; /* Mesma lógica aplicada para adicionar as palavras a estrutura de dados, mas dessa vez cada palavra é usada na função de oonsulta da AVL */ while((c = fgetc(consulta))!= EOF) { if(c == ' ' || c == ',' || c == '.' || c == ';'|| c == '?'|| c == '!' || c == '\n' || c == '-' || c == '*' || c == '/' || c == '*'|| c == ':'|| c == '|' || c == '(' || c == ')' || c == ')' || c == '_'|| c == '['|| c == ']' || c == '=' || c == '"' || c == '\t' || c == '>' || c == '<' || c == '+' || c == '{' || c == '}' ) //Se leu espaço ou pontuacoes significa que acabou palavra, logo adiciona ela a struct AVL { p_consulta[k] = '\0'; strlwr(p_consulta); if(strcmp(p_consulta,"") !=0) consultaAVL(arv, p_consulta,saida); k=0; p_consulta[k]= '\0'; //Zera a string, para estar vazia para a proxima palavra } else { p_consulta[k] = c; k++; } } /* Usado para consultar ultima palavra caso não tenha um ENTER ou espaço nela*/ p_consulta[k] = '\0'; strlwr(p_consulta); if(strcmp(p_consulta,"") !=0) consultaAVL(arv, p_consulta,saida); k=0; p_consulta[k]= '\0'; //Zera a string, para estar vazia para a proxima palavra diff = clock() - start; //Diferença entre o tempo que iniciou com o tempo atual, para saber o tempo de consulta int msec = diff * 1000 / CLOCKS_PER_SEC; printf("\nTempo gasto na consulta %d segundos %d milisegundos", msec/1000, msec%1000); fprintf(saida,"\nTempo gasto na consulta %d segundos %d milisegundos", msec/1000, msec%1000); //Adicionada a informação no arquivo de saida } fclose(texto); fclose(consulta); fclose(saida); return 0; } }
void Inserir(struct Dicionario * D, struct Item I) { // D->raiz = InserirRecursivo(D->raiz, I); InsereAVL(&D->raiz, I); }
int main() { clock_t Ticks[2]; FILE *texto; //Arquivo com texto para indexação. FILE *consulta; //Arquivo que contém as palavras para consulta. FILE *saida; //Arquivo para saida dos resultados char palavra[25] = {' '} ; char ch; int i = 0, linha = 1; int *ok = 0; pNodoA *raiz = NULL; pNodoA* a = raiz; TipoPtNo *lista=NULL; TNodoA *achou = NULL; // Abre os arquivos para leitura e escrita texto = fopen("in.txt","r"); consulta = fopen("find.txt","r"); saida = fopen("out.txt","w"); if((texto != NULL) && (consulta != NULL)) { // Se deu tudo certo com os arquivos printf("Arquivos ok..\n"); while((ch=fgetc(texto))!= EOF) { // Comparações dentro do arquivo, para reconhecer so' as palavras e nao pegar simbolos juntos if(ch == ' ' || ch == '.' || ch == ',' || ch == ';' || ch == '!' || ch == '?' || ch == '"' || ch == '@' || ch == '#' || ch == '$' || ch == '%' || ch == '=' || ch == '&' || ch == '|') { i=0; // Inserindo na AVL raiz = InsereAVL(raiz, palavra, &ok,linha); // Zera o array palavra memset(palavra,(char)0,sizeof(char)*25); } else { // Se encontra quebra de linha, incrementa o contador de linhas if(ch == '\n') { linha++; } // Deixando todas letras minusculas para fazer as comparacoes ch = tolower(ch); // Salvando o que está achando no texto no vetor de caracteres(palavra) palavra[i] = ch; i++; } } Ticks[0] = clock(); // Iniciando o contador de tempo // Vai fazendo comparacoes até chegar no final do arquivo aberto while((ch=fgetc(consulta))!= EOF) { i=0; while(ch != '\n') { ch = tolower(ch); palavra[i] = ch; // Comparacao direta, sem uso de estrutura auxiliar para fazer comparacoes, fazendo economia de tempo ch=fgetc(consulta); i++; } palavra[i] = '\0'; //String deve ser terminada com \0 // achou recebe o retorno da palavra consultada achou = consultar(raiz,palavra); if(achou) { achou->dir = NULL; achou->esq = NULL; imprimeAVL(achou,saida); } else { // Em caso de percorrer todo o arquivo a palavra procurada fprintf(saida,"Consulta: %-10s Palavra não encontrada\n",palavra); } // Zera o vetor de caracteres (palavra) memset(palavra,(char)0,sizeof(char)*25); } // Fecha o contador de tempo Ticks[1] = clock(); double Tempo = (Ticks[1] - Ticks[0]) * 1000.0 / CLOCKS_PER_SEC; // Exibe o tempo gasto com a consulta fprintf(saida," \n Tempo gasto: %g ms.", Tempo); // Fechamento dos arquivos utilizados ao longo da execução do programa fclose(consulta); fclose(texto); fclose(saida); // Desalocando a memória utilizada pela árvore DestroiAvl(raiz); } else { // Em caso de nao conseguir ler os arquvios do disco printf("Erro ao realizar a leitura dos arquivos...\n"); } return(0); }