Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
    }

}
Exemple #4
0
void Inserir(struct Dicionario * D, struct Item I)
{
	// D->raiz = InserirRecursivo(D->raiz, I);
	InsereAVL(&D->raiz, I);
}
Exemple #5
0
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);
}