/* copia_no() - Funcao que copia as informacoes de um NO recebido para outro que eh retornado Parametros: NO *p - ponteiro para um NO Retorno: NO* - retorna um NO alocado dinamicamente */ NO *copia_no(NO *p) { NO *aux = NULL; if(p != NULL) aux = criar_no(criar_item(p->item->codigo, p->item->nomeSite, p->item->relevancia, p->item->link)); return aux; }
/** * Funcao Criar Arvore de Huffman * @brief Funcao que gera uma arvore de huffman inicial totalmente nula e a retorna para o usuario * Primeiramente a funcao tenta alocar a arvore na memoria, se foi possivel aloca-la ela */ Huffman* criar_arvore_huffman () { Huffman* h = (Huffman*) malloc(sizeof(Huffman)); if (h!=NULL) { h->cabeca = criar_no(); h->caracteres = 0; h->tamanho = 0; h->tamanho_compressao_final = 0; int i, j; for (i=0; i<MAX; i++) { for (j=0; j<MAX; j++) { h->texto[i][j] = 0; } } for (i=0; i<TOTSIM; i++) { h->frequencia_letras[i] = 0; } return h; } return NULL; }
void leArquivo(FILE *fp, LISTA *lista){ int codigo, relevancia, i; char nomeSite[TAM], link[N]; char carac; char *tok; fscanf(fp, "%c", &carac); while(!feof(fp)){ int count = 0; char *arq = NULL; while(!feof(fp) && carac != '\n'){ arq = (char *)realloc(arq, sizeof(char) * (count+1)); arq[count++] = carac; fscanf(fp, "%c", &carac); } arq = (char *)realloc(arq, sizeof(char) * (count+1)); arq[count] = '\0'; tok = strtok(arq, ","); codigo = atoi(tok); tok = strtok(NULL, ","); strcpy(nomeSite, tok); nomeSite[TAM-1] = '\0'; tok = strtok(NULL, ","); relevancia = atoi(tok); tok = strtok(NULL, ","); strcpy(link, tok); link[N-1] = '\0'; insere_site(lista, criar_no(criar_item(codigo, nomeSite, relevancia, link))); tok = strtok(NULL, ","); while(tok != NULL){ for(i=0; i < strlen(tok); i++){ tok[i] = ctolower(tok[i]); } insere_chave(lista, codigo, tok); tok = strtok(NULL, ","); } free(arq); fscanf(fp, "%c", &carac); } }
/** * Funcao Montar Arvore de Huffman * @brief Funcao gera uma arvore de huffman produzindo todos os nos da mesma * Funcao que possui como entrada uma arvore @param h que atraves da lista encadeada que a variavel h possui monta uma arvore, * removendo os elementos de menor frequencia no processo e unindo-os em um novo no x que representa a soma das frequencias dos nos * de menor frequencia, informando tambem os lados que os nos removidos e retornados ao programa irao se encaixar na arvore. Portanto, * percebe-se que essa funcao destroi a antiga lista encadeada e a remonta como a verdadeira arvore de huffman */ void montar_arvore_huffman (Huffman* h) { while (h->tamanho>1) { No* s0 = remover_item_menor_frequencia(h); No* s1 = remover_item_menor_frequencia(h); No* x = criar_no(); s0->lado = '0'; s1->lado = '1'; x->filhoesq = s0; x->filhodir = s1; x->frequencia = s0->frequencia + s1->frequencia; inserir_no(h, x); } }
/** * Funcao Criar Nos Folhas * @brief Funcao que gera os nos iniciais para a montagem da arvore de huffman * Funcao que avalia se a frequencia das letras que estao na arvore for maior que zero, se isso ocorre nos sao criados para cada * letra e sao inseridos utilizando a funcao de inserir os nos de maneira ordenada pela frequencia (@see inserir_no) */ void criar_nos_folhas (Huffman* h) { int i; /**< indice do for*/ No* novo; for (i=0; i<TOTSIM; i++) { if (h->frequencia_letras[i]>0) { novo = criar_no(); novo->letra = i; novo->frequencia = h->frequencia_letras[i]; inserir_no(h, novo); } } }
LISTA_LIGADA *criar_lista() { LISTA_LIGADA *lista = (LISTA_LIGADA *)malloc(sizeof(LISTA_LIGADA)); if(lista != NULL) { lista->sentinela = criar_no(criar_item(-1,-1), NULL); printf("Debug criação de lista->sentinela\n"); lista->sentinela->proximo = lista->sentinela; lista->fim = lista->sentinela; lista->tamanho = 0; } return lista; }
void sugestao_site(LISTA *lista, char *chave) { LISTA *sugestoes = criar_lista(); LISTA_SEQ *aux = criar_lista_seq(); int flag = 0; if(lista != NULL && chave != NULL) { NO *p = lista->cabeca->proximo; //primeira busca e preenchendo a lista 'aux' com as palavras chaves de todos os resultados encontrados while(p != NULL) { if(busca_chave_seq(p->item->palavras, chave, 0, tamanho_seq(p->item->palavras)-1)) { transfere_seq(aux, p->item->palavras); flag = 1; } p = p->proximo; } //segunda busca - utilizando todas as palavras chaves while(!listaVazia_seq(aux)) { char *word = remove_fim_seq(aux); p = lista->cabeca->proximo; while(p != NULL) { if(busca_chave_seq(p->item->palavras, word, 0, tamanho_seq(p->item->palavras)-1)) { insere_site(sugestoes, criar_no(criar_item(p->item->codigo, p->item->nomeSite, p->item->relevancia, p->item->link))); } p = p->proximo; } free(word); } //imprimindo os resultados if(!vazia(sugestoes) && (sugestoes!=NULL)) { p = sugestoes->cabeca->proximo; while(p != NULL) { imprime_site_busca(p); p = p->proximo; } } if(flag == 0) { printf("Nenhum resultado encontrado!\n"); } liberar_lista_seq(&aux); apagar_lista(&sugestoes); } }
int main(void){ no_t *inicio, *cadastro; // cadastro será usado para verificar se um // nome já existe com aquele cadastro char nome[20]; short controle, op; inicio=NULL; cadastro=NULL; // Menu controle=1; while( controle) { printf("============== Menu ============\n"); printf("0. Sair \n"); printf("1. Inserir \n"); printf("2. Mostrar Nomes\n"); printf("3. Pesquisar por Nome \n"); printf("4. Remover por Nome \n"); printf("Opção: "); __fpurge(stdin); scanf("%hd", &op); switch(op){ case 0: // Sair controle = 0; break; case 1: // Inserir inserir(&inicio, criar_no()); continuar(&controle); system("clear"); break; case 2: // Mostrar if( inicio == NULL ){ printf("A lista está vazia.\n"); continuar(&controle); } else{ mostrar_lista(inicio); continuar(&controle); } break; case 3: // Pesquisar if( inicio == NULL ){ printf("A lista está vazia.\n"); continuar(&controle); } else{ printf("\nNome: "); __fpurge(stdin); fgets(nome,20,stdin); nome[0] = toupper(nome[0]); // procura se o nome já foi cadastrado cadastro = pesquisar(inicio,nome); if( cadastro == NULL ){ printf("Nome não cadastrado.\n"); continuar(&controle); } else{ // Mostrar dados printf("Rua: %sNumero: %s", cadastro->rua, cadastro->numero); printf("Cidade: %sEstado: %s", cadastro->cidade, cadastro->estado); continuar(&controle); } } break; case 4: // Remover if( inicio == NULL ){ printf("A lista está vazia.\n"); continuar(&controle); } else{ printf("Nome: "); __fpurge(stdin); // limpa o buffer do teclado fgets(nome,20,stdin); nome[0]=toupper(nome[0]); if( remover(&inicio, nome) == true){ printf("Removido.\n"); } else{ printf("Não está na lista.\n"); } continuar(&controle); } break; default: printf("Erro, opção inválida.\n"); __fpurge(stdin); continuar(&controle); break; }// end switch }// end while return 0; }
int main(int argc, char const *argv[]) { FILE *fp = fopen("googlebot.txt", "r"); LISTA *lista = criar_lista(); int oper, codigo, relevancia, i; char *palavra, *nomeSite, *link; leArquivo(fp, lista); fclose(fp); if(fp != NULL){ do{ printf("1 - Inserir site\n2 - Inserir palavra chave\n3 - Remover um site\n4 - Atualizar relevancia\n"); printf("5 - Mostrar lista\n6 - Busca por palavra chave\n7 - Sugestoes de sites\n8 - Sair\n\n"); scanf("%d", &oper); switch(oper){ case 1: //Inserir um novo site na lista do{ printf("Codigo: "); scanf("%d", &codigo); if(codigo < 0 || codigo > 9999) printf("Codigo invalido. Digite um valor entre 0 e 9999\n"); }while(codigo < 0 || codigo > 9999); getchar(); printf("Nome Site: "); nomeSite = lerString(); if(strlen(nomeSite) > TAM-1) nomeSite[TAM-1] = '\0'; do{ printf("Relevancia: "); scanf("%d", &relevancia); if(relevancia < 0 || relevancia > 1000) printf("Relevancia invalido. Digite um valor entre 0 e 1000\n"); }while(relevancia < 0 || relevancia > 1000); getchar(); printf("Link: "); link = lerString(); if(strlen(link) > N-1) link[N-1] = '\0'; if(!insere_site( lista, criar_no(criar_item(codigo, nomeSite, relevancia, link)))){ printf("Erro ao inserir site!\n"); } free(link); free(nomeSite); break; case 2: //Inserir palavra chave do{ printf("Codigo: "); scanf("%d", &codigo); if(codigo < 0 || codigo > 9999) printf("Codigo invalido. Digite um valor entre 0 e 9999\n"); }while(codigo < 0 || codigo > 9999); getchar(); printf("Palavra chave: "); palavra = lerString(); if(strlen(palavra) > TAM-1) palavra[TAM-1] = '\0'; for(i=0; i < strlen(palavra); i++){ palavra[i] = ctolower(palavra[i]); } if(!insere_chave(lista, codigo, palavra)){ printf("Erro ao inserir palavra chave!\n"); } free(palavra); break; case 3: //Remover um site do{ printf("Codigo: "); scanf("%d", &codigo); if(codigo < 0 || codigo > 9999) printf("Codigo invalido. Digite um valor entre 0 e 9999\n"); }while(codigo < 0 || codigo > 9999); if(!remove_site(lista, codigo)){ printf("Erro ao remover site!\n"); } break; case 4: //Atualizar relevancia do{ printf("Codigo: "); scanf("%d", &codigo); if(codigo < 0 || codigo > 9999) printf("Codigo invalido. Digite um valor entre 0 e 9999\n"); }while(codigo < 0 || codigo > 9999); do{ printf("Relevancia: "); scanf("%d", &relevancia); if(relevancia < 0 || relevancia > 1000) printf("Relevancia invalido. Digite um valor entre 0 e 1000\n"); }while(relevancia < 0 || relevancia > 1000); atualiza_relevancia(lista, codigo, relevancia); break; case 5: //Mostrar a lista imprime_lista(lista); break; case 6: //Busca por palavra chave getchar(); printf("Palavra chave: "); palavra = lerString(); if(strlen(palavra) > TAM-1) palavra[TAM-1] = '\0'; for(i=0; i < strlen(palavra); i++){ palavra[i] = ctolower(palavra[i]); } busca_palavra(lista, palavra); free(palavra); break; case 7: //Sugestao do site getchar(); printf("Palavra chave: "); palavra = lerString(); if(strlen(palavra) > TAM-1) palavra[TAM-1] = '\0'; for(i=0; i < strlen(palavra); i++){ palavra[i] = ctolower(palavra[i]); } sugestao_site(lista, palavra); free(palavra); break; default: break; } }while(oper != 8); finaliza_lista(&lista); } else { printf("Could not open googlebot.txt\n"); } return 0; }