Ir ao conteúdo
  • Cadastre-se

Angeline Melchiors

Membros Juniores
  • Total de itens

    6
  • Registro em

  • Última visita

  • Qualificações

    N/D
  1. Estou fazendo um trabalho de aula, de remoção em árvore de busca binária. Não consigo ver o erro, só sei que retorna (VALOR INVÁLIDO) quando deveria ter sido SUCESSO, imagino que acontece pois a remoção não ocorreu. Abaixo as funções envolvidas. Alguém consegue me ajudar? codigo_erro abb_insere (abb_t* arv, void* data){ if (!arv) return INVALIDO; if (arv->compara == NULL) return ESTADO_INVALIDO; if (arv->raiz == NULL) { node_t *no = (node_t*) malloc(sizeof(node_t)); no->esquerda = NULL; no->direita = NULL; no->info = data; arv->raiz = no; arv->tamanho++; return SUCESSO; } if (abb_busca_bin(arv, data)) return DUPLICADO; node_t *aux = arv->raiz; node_t *pai = NULL; while (aux != NULL && aux->info != data) { pai = aux; if (arv->compara (data, aux->info)==-1) aux = aux->esquerda; else aux = aux->direita; } node_t *no = (node_t*) malloc(sizeof(node_t)); no->esquerda = NULL; no->direita = NULL; no->info = data; if (arv->compara (data, pai->info)==-1) pai->esquerda = no; else pai->direita = no; arv->tamanho++; return SUCESSO; } codigo_erro abb_remove (abb_t* arv, const void* data){ if (arv == NULL || arv->raiz == NULL) return UNDER_FLOW; if (!data) return VALOR_INVALIDO; if (abb_busca_bin(arv, (void*)data) == 0) return VALOR_INVALIDO; rem_rec(&(arv->raiz), data, arv); arv->tamanho--; return SUCESSO; } void rem_rec(node_t **aux, const void* data, abb_t *arv){ if(aux == NULL)return; if(*aux == NULL)return; // return; if(arv->compara(data, (*aux)->info)==-1) rem_rec(&(*aux)->esquerda, data, arv); if(arv->compara(data, (*aux)->info)==1) rem_rec(&(*aux)->direita, data, arv); else libera_no(&(*aux),data); return; } void libera_no(node_t **aux, const void* numero){ node_t *pai = *aux; if ((*aux)->esquerda == NULL && (*aux)->direita == NULL){//folha free(pai); (*aux) = NULL; return; } if((*aux)->esquerda == NULL){ //só tem filho direito *aux=(*aux)->direita; free(pai); pai=NULL; return; } if ((*aux)->direita == NULL){ //só tem filho esquerdo *aux = (*aux)->esquerda; free(pai); pai = NULL; return; } pai = MenorDireita(&(*aux)->esquerda); //tem dois filhos pai->esquerda = (*aux)->esquerda; pai->direita = (*aux)->direita; (*aux)->esquerda = NULL; (*aux)->direita = NULL; free((*aux)); *aux = pai; pai = NULL; return; } node_t *MenorDireita(node_t **noh){ if((*noh)->direita != NULL) return MenorDireita(&(*noh)->direita); node_t *aux = *noh; if((*noh)->esquerda != NULL) { *noh = (*noh)->esquerda; return aux; } *noh = NULL; return aux; }
  2. Resolvido! Perdi muito tempo e nao vi isso Obs: sim, as impressoes foram somente para o meu controle.
  3. Olá! Preciso como atividade de aula fazer a seguinte função: Crie um programa em C que receba um vetor de números reais com 100 elementos. Escreva uma função recursiva que inverta ordem dos elementos presentes no vetor. Criei o código: #include <stdio.h> #include <stdlib.h> #include <time.h> #define tam 100 /*2. Crie um programa em C que receba um vetor de números reais com 100 elementos. Escreva uma função recursiva que inverta ordem dos elementos presentes no vetor.*/ float invert(float vetor[], int a, int b){ if (vetor != NULL){ if ((b-a)>0) { printf("\n ANTES: vetor [%i] = %.2f e vetor [%i] = %.2f",a, vetor[a], b,vetor[b]); // ==>> para teste float aux = vetor[a]; vetor[a] = vetor[b]; vetor[b] = aux; printf("\n DEPOIS: vetor [%i] = %.2f e vetor [%i] = %.2f",a, vetor[a], b,vetor[b]); ==>> para teste invert(&vetor[tam], a+1, b-1); } else { return 0; } } } int main (){ srand(time(NULL)); float vetor[tam]; for (int i=0; i<tam; i++){ vetor[i] = rand () %10; } for (int i=0; i<tam; i++){ printf("%.2f ", vetor[i]); } printf("\n"); invert(vetor, 0, tam-1); for (int i=0; i<tam; i++){ printf("%.2f ", vetor[i]); } return 0; } Mas ele não conclui a execução. Abaixo o resultado, com apenas 10 elementos: Talvez recursividade não seja a melhor opção, mas preciso fazer dessa forma porque o exercício pede. Dúvidas: 1) porque ele aborta? Minha condição base não encerra? (o erro é sempre na última troca, ex posições 49 e 50) Testei valores menores e maiores, pares e impares. 2) porque ele gera valores grandes se limitei o meu rand a 10? Grata.
  4. Obrigada!! Consegui, mas usando calloc no lugar de malloc. Só não sei o que realmente aconteceu, mas funcionou!
  5. @AnsiCe @isrnick vocês estão certos, na verdade é um vetor de caracteres. Achei que ficava mais fácil de explicar considerando um único char. Tentei adaptar as duas soluções para vetor, mas não fui capaz. Agradeço se puderem me ajudar novamente.
  6. Olá! Preciso, para um exercício de aula, escrever uma função com protótipo char* separa(int numero) e essa função deve retornar um char. Porém ela retorna um endereço! Imagino que seja por causa do * após char. Não posso mudar o protótipo, ele precisa ficar exatamente assim, e a avaliação é pelo return da função, não posso converter no main. Como faço para que o retorno seja um char? Grata.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×