Vous êtes sur la page 1sur 7

D:\TRABALHOPOD.

segunda-feira, 31 de outubro de 2011 02:32

/* GRUPO: Cssio Libraga Cesar Frantz Gabriel Lunardi Juliano Geiss ESTRUTURA DE DADOS: rvores Binrias */ //funcoes.h #include <stdio.h> #include <stdlib.h> #include <string.h> //cria a rvore de linhas struct arv{ int linha; struct arv* esq; struct arv* dir; }; typedef struct arv Arv; //cria a rvore de termos struct term{ char palavra[20]; struct arv* linhas; struct term* esq; struct term* dir; }; typedef struct term Term; Arv* inicia_arv_linha(void); //funo para iniciar a rvore de linhas Arv* ins_arv_linha(Arv* a, int linha); //funo para inserir na rvore de linhas Term* f_remove (Term* a); //funo que mostra texto para remover da rvore de termos Term* abb_retira (Term* r, char v[]); //funo que remove da rvore de termos Term* abb_insere (Term* a, char v[]); //funo que insere na rvore de termos Term* insere_linhas(Term* a, char pal[], int linha); //funo que verifica se a palavra est na rvore de termos,se estiver, insere as linhas Term* Pega_Palavra (Term* termos, char* linha, int contalinha); //funo para pegar as palavras do texto Term* busca_termo (Term* r, char v[]); //funo que busca se um termo est na rvore de termos int f_menu(); //funao para mostrar o menu int term_vazia(Term* a); //funo para verifica se a rvore de termos est vazia int arv_vazia(Arv* a); //funo que verifica se a rvore de linhas est vazia int arv_pertence (Arv* a, char c); //funo para verificar se pertence a rvore de linhas void f_inv(); //funo que mostra a opo invlida void print_arv_pag(Arv* a); //funo que mostra a rvore de pginas void term_imprime (Term* a); //funo que mostra a rvore de termos void term_imprime_unico (Term* a); //funo que imprime um termo //main.c #include <stdio.h> #include <stdlib.h> #include <string.h>
-1-

D:\TRABALHOPOD.c

segunda-feira, 31 de outubro de 2011 02:32

#include "funcoes.h" #include <ctype.h> int main(void){ int contalinha,opcao,op,status; char c,linha[200],termo[20],palavra[20],entrada[50]; FILE* e; FILE* e2; char entrada2[] = "d:\\entrada2.txt"; Term* busca; Term* termos; termos = NULL; printf("digite o caminho do arquivo de entrada: "); fflush(stdin); gets(entrada); e = fopen(entrada,"r+"); //abre o arquivo de entrada, com r+ para leitura e gravao if (e == NULL){ //se nao abriu o arquivo printf("\nErro na abertura do arquivo!!\n\n"); system("pause"); exit(1); //sai do programa } e2 = fopen(entrada2,"w+"); //cria o arquivo de entrada2, com w+ para para leitura e gravao, //se o arquivo no existir, cria while ((c = fgetc(e)) != EOF) //enquanto no for fim do arquivo, pega caractere do arquivo de entrada fputc(toupper(c),e2); //passa para maiusculo o caractere pegado da entrada e salva no arquivo entrada 2. rewind(e); //posiciona o ponteiro do arquivo de entrada no inicio do{ op = f_menu(); //chama a funcao que desenha o menu switch (op) { case 1: status = 0; do{ printf("\nDigite um termo: "); scanf(" %[^\n]",termo); //le termo strcpy(termo,strupr(termo)); if (termo[0] >= 48 && termo[0] <= 57) { //verifica se o primeiro caractere um numero printf("\nPrimeiro caractere deve ser uma letra.\n\n"); system("pause"); } else { status++; termos = abb_insere(termos, termo); //insere indice na arvore de termos } do{ printf("\n\nDeseja inserir mais um termo? "); printf("\n1 - Sim"); printf("\n2 - Nao"); printf("\nOpcao: "); scanf("%d", &opcao); if(opcao!=1 && opcao!=2) { printf("\nOpcao Invalida - Tente Novamente."); } }while(opcao!=1 && opcao!=2); }while(opcao!=2); if (status>0) { rewind(e2);
-2-

D:\TRABALHOPOD.c

segunda-feira, 31 de outubro de 2011 02:32

//posiciona o ponteiro do arquivo de entrada2 no inicio contalinha=1; while(!feof(e2)){ //enquanto no for o fim do arquivo de entrada 2 fgets(linha, 200, e2); //pega linha a linha do arquivo de entrada 2 termos = Pega_Palavra(termos,linha,contalinha); contalinha++; //incrementa o contalinha } } break; case 2: term_imprime(termos); //imprime os termos da rvore printf("\n\n"); system("pause"); break; case 3: printf("\nDigite a palavra a ser procurada: "); scanf(" %[^\n]",palavra); //le palavra strcpy(palavra,strupr(palavra)); //passa pra maisculo a palavra busca = busca_termo(termos, palavra); //busca a palavra na rvore de termos if (busca!=NULL) //se nao retornou NULL term_imprime_unico(busca); //imprime o n retornado else printf("\n%s nao esta na arvore de indices",palavra); printf("\n\n"); system("pause"); break; case 4: termos = f_remove(termos); printf("\n\n"); system("pause"); break; case 5: break; default: f_inv(); } }while(op!=5); fclose(e2); //fecha o arquivo entrada 2 remove(entrada2); //deleta o arquivo entrada 2 return 0; }

//funcoes.c #include #include #include #include #include <stdio.h> <stdlib.h> <string.h> "funcoes.h" <conio.h>

Arv* inicia_arv_linha (void){ return NULL; //inicia a rvore de linhas } Arv* ins_arv_linha(Arv* a, int linha){ if(a == NULL){ //se a rvore est vazia a=(Arv*) malloc(sizeof(Arv)); //aloca espao para o n
-3-

D:\TRABALHOPOD.c

segunda-feira, 31 de outubro de 2011 02:32

a->linha = linha; //insere o valor da linha que foi passado a->esq = NULL; //inicializa a rvore de linhas da esquerda a->dir = NULL; //inicializa a rvode de linhas da direita } else if (a->linha > linha) { //se o valor de linha passado menor que //chama a funo de inserir na rvore, a->esq = ins_arv_linha(a->esq, linha); } else if (a->linha< linha) { //se o valor de linha passado maior que //chama a funo de inserir na rvore, a->dir = ins_arv_linha(a->dir, linha); } return a; //retorna a rvore } Term* abb_insere (Term* a, char v[]){ int c; if (a==NULL) { //se a arvore de termos esta vazia a = (Term*)malloc(sizeof(Term)); //aloca espao para o n strcpy(a->palavra,v); //insere a palavra passada a->esq = NULL; //inicializa a rvore de termos da esquerda a->dir = NULL; //inicializa a rvore de termos da esquerda a->linhas = inicia_arv_linha(); //inicializa a rvore de linhas } else { c = strcmp(a->palavra, v); //compara a palavra passada com a palavra do n if (c == -1) { //se a palavra passada for maior que a palavra do n a->dir = abb_insere(a->dir,v); //chama a funo pra inserir na rvore da dir. } else if (c == 1) { //senao se a palavra passada for menor que a palavra do n a->esq = abb_insere(a->esq,v); //chama a funo pra inserir na rvore da esq. } } return a; //retorna a rvore } Term* insere_linhas(Term* a, char pal[], int linha){ if(a == NULL) //se a rvore de termos est vazia return a; //nao faz nada e retorna a rvore else if (strcmp(a->palavra,pal) == 0) { //seno compara a palavra passada com a palavra do n, se forem iguais a->linhas = ins_arv_linha(a->linhas,linha); //insere a linha na rvore de linhas } else if(strcmp(a->palavra,pal) > 0) { //seno compara a palavra passada com a palavra do n, //se a palavra passada for menor que a palavra do n insere_linhas(a->esq,pal,linha); //chama a funo novamente, passando a rvore de termos da esq., palavra e linha } else { //senao, a palavra passada maior que a palavra do n insere_linhas(a->dir,pal,linha); //chama a funo novamente, passando a rvore de termos da dir., palavra e linha } return a; //retorna a rvore de termos }
-4-

o valor da linha que est na raiz passando a rvore de linhas da esquerda.

o valor da linha que est na raiz passando a rvore de linhas da esquerda.

D:\TRABALHOPOD.c

segunda-feira, 31 de outubro de 2011 02:32

Term* Pega_Palavra (Term* termos, char* linha, int contalinha) { int i=0,a=0; char var[20]; while (linha[i] != '\n' && linha[i] != '\0') { //enquanto no for o fim da linha a=0; while((linha[i] != '.') && (linha[i] != ',') && (linha[i] != ' ') && (linha[i] != ':') && (linha[i] != ';') && (linha[i] != '?') && (linha[i] != '!') && (linha[i] != '(') && (linha[i] != ')') && (linha[i] != '\n')){ //enquanto no for um caractere diferente de letra var[a] = linha[i]; //passa o caractere da linha pra varivel que est "montando" a palavra a++; //incrementa a i++; //incrementa a if ((linha[i]<'A' || linha[i]>'Z') && (linha[i]<48 || linha[i]>57)){ //se o caractere nao for uma letra var[a] = '\0'; //entao "fecha" a palavra termos= insere_linhas(termos,var,contalinha); //procura se a palavra est na rvore de termos, se estiver, insere a linha } } if (linha[i] != '\n') //se no for fim da linha i++; //incrementa o i } return termos; //retorna a rvore de termos } Term* busca_termo (Term* r, char v[]) { if (r == NULL || (strcmp(r->palavra,v)==0)) //se for NULL ou se a palavra do n igual a palavra passada return r; //retorna o n if (strcmp(r->palavra, v)==1) //se a palavra passada menor que a palavra do n return busca_termo(r->esq, v); //busca o termo na rvore da esquerda else //senao a palavra passada maior que a palavra do n return busca_termo(r->dir, v); //busca o termo na rvore da direita } void f_inv(){ printf ("\nOpcao invalida - Tente novamente.\n\a"); //imprime a frase na tela getch(); } Term* f_remove (Term* a){ char termo[20]; printf("\nDigite um termo: "); scanf(" %[^\n]",termo); //l a string termo strcpy(termo,strupr(termo)); //passa a string para misculo a = abb_retira(a,termo); //chama a funo para retirar o termo da rvore de termos, passando a rvore e a palavra return a; //retorna a rvore de termos } Term* abb_retira (Term* r, char v[]) { int comp=0; if (r == NULL) { //se a rvore de termos est vazia printf("\n%s nao pertence ao indice de termos.",v); return NULL; //retorna NULL
-5-

D:\TRABALHOPOD.c

segunda-feira, 31 de outubro de 2011 02:32

} else { //se a rvore de termos no est vazia comp = strcmp(r->palavra,v); //compara a palavra do n com a palavra passada if (comp==1) //se a palavra do n for maior que a palavra passada r->esq = abb_retira(r->esq, v); //chama a funo para retirar da rvore de termos, passando a rvore da esq. e a palavra else if (comp==-1) //se a palavra do n for menor que a palavra passada r->dir = abb_retira(r->dir, v); //chama a funo para retirar da rvore de termos, passando a rvore da dir. e a palavra else { //se a palavra do n for igual a palavra passada if (r->esq == NULL && r->dir == NULL) { //se a rvore da esquerda e direita forem NULL printf("\nElemento retirado.\n"); free (r); //libera o espao alocado r = NULL; } else if (r->esq == NULL){ //se a rvore da direita no NULL Term* t = r; //varivvel auxiliar r = r->dir; //passa a rvore da direita para a varivel auxiliar printf("\nElemento retirado.\n"); free (t); //libera o espao alocado } else if (r->dir == NULL){ //se a rvore da esquerda no NULL Term* t = r; //varivel auxiliar r = r->esq; //passa a rvore da esquerda para a varivel auxiliar printf("\nElemento retirado.\n"); free (t); //libera o espao alocado } else{ //senao se as duas no so NULL Term* f = r->esq; //varivel auxiliar igual a rvore da esquerda while (f->dir != NULL){ //enquanto a rvore da direita de R no for NULL f = f->dir; //F igual a rvore da direita } strcpy(r->palavra,f->palavra); //copia a palavra de F para R strcpy(f->palavra,v); //copia a palavra passada para F r->esq = abb_retira(r->esq,v); //chama a funo para retirar da rvore, passando a rvore da esquerda } } } return r; //retorna a rvore } int arv_vazia(Arv* a){ return a==NULL; //retorna 1 se a rvore de linhas for vazia } int term_vazia(Term* a){ return a==NULL; //retorna 1 se a rvore de termos for vazia } int f_menu(){ int op; system("CLS"); printf("\nMENU:"); printf("\n1 - Inserir Palavra Chave"); printf("\n2 - Listar Indice Invertido");
-6-

D:\TRABALHOPOD.c

segunda-feira, 31 de outubro de 2011 02:32

printf("\n3 - Pesquisa"); printf("\n4 - Remove Palavra"); printf("\n5 - Sair"); printf("\nOpcao: "); scanf("%d", &op); return op; } void print_arv_pag(Arv* a){ if (a != NULL){ //se a rvore de linhas no for NULL print_arv_pag(a->esq); //chama a funo novamente, passando a rvore da esquerda printf (", %d",a->linha); print_arv_pag(a->dir); //chama a funo novamente, passando a rvore da direita } } void term_imprime (Term* a){ if(!term_vazia(a)){ //se a rvore de linhas no for NULL term_imprime(a->esq); //chama a funo novamente, passando a rvore da esquerda printf ("\n%s", a->palavra); print_arv_pag(a->linhas); //chama a funo pra imprimir a rvore de linhas term_imprime(a->dir); //chama a funo novamente, passando a rvore da direita } } void term_imprime_unico (Term* a){ printf ("\n%s", a->palavra); print_arv_pag(a->linhas); //chama a funo pra imprimir rvore de linhas }

-7-

Vous aimerez peut-être aussi