//Realiza la búsqueda del nodo para insertar la llave y hace las subdivisiones cuando son necesarias arbolB *insere(arbolB *raiz, int info, bool *h, int *info_retorno) { int i, j, pos, info_mediano; //auxiliar para almacenar la llave que irá a subir para el padre arbolB *temp, *filho_dir; //puntero para el hijo derecho de la llave if (raiz == NULL) { //El nodo anterior es el ideal para insertar la nueva llave (llegó a un nodo hoja) *h = true; *info_retorno = info; return(NULL); } else { pos = busca_binaria(raiz,info); if (raiz->num_llaves > pos && raiz->llaves[pos] == info) { printf("Llave ya contenida en el Árbol"); *h = false; } else { //desciende en el árbol hasta encontrar el nodo hoja para insertar la llave. filho_dir = insere(raiz->hijos[pos],info,h,info_retorno); if (*h) //Si verdadero, debe insertar la info_retorno en el nodo. { if (raiz->num_llaves < MAX_CHAVES) //Tiene espacio en la página { insere_chave(raiz, *info_retorno, filho_dir); *h = false; } else { //Overflow. Necesita subdividir temp = (arbolB *) malloc (sizeof(arbolB)); temp->num_llaves = 0; //inicializa hijos con NULL for (i = 0; i < MAX_HIJOS; i++) temp->hijos[i] = NULL; //elemento mediano que va subir para el padre info_mediano = raiz->llaves[MIN_OCUP]; //inserta mitad del nodo raíz en temp (efectua subdivisión) temp->hijos[0] = raiz->hijos[MIN_OCUP+1]; for (i = MIN_OCUP + 1; i < MAX_CHAVES; i++) insere_chave(temp, raiz->llaves[i], raiz->hijos[i+1]); //actualiza nodo raíz. for (i = MIN_OCUP; i<MAX_CHAVES; i++) { raiz->llaves[i] = 0; raiz->hijos[i+1] = NULL; } raiz->num_llaves = MIN_OCUP; //Verifica en cuál nodo será insertada la nueva llave if (pos <= MIN_OCUP) insere_chave(raiz, *info_retorno, filho_dir); else insere_chave(temp, *info_retorno, filho_dir); //retorna el mediano para insertarlo en el nodo padre y el temp como hijo derecho del mediano. *info_retorno = info_mediano; return(temp); } } } } }
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); } }
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; }