/* 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; }
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); } }
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(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; }