Ir ao conteúdo

Posts recomendados

Postado

Boa tarde, pessoal. Como estão? (espero que bem) 😄

 

Estava eu a resolver um exercício de programação e me deparei com uma dificuldade enorme para criar uma função remove. 

Muito se dar pois nao sei o que devo remover primeiro, esquerda, direita, meio. Ou ate mesmo se removo os no.

Fora que ela tem que remover o numero desejado pelo usuario.

 

E ainda estou com uma dificuldade na função principal. 

 

#include <stdio.h>
#include <stdlib.h>



typedef struct _no23 {
   int  lkey,             // chave esquerda
        rkey,             // chave direita
        nkeys;            // n�mero de chaves
   struct _no23 *left,    // ponteiro ao filho esquerdo
                *center,  // ponteiro ao filho central
                *right;   // ponteiro ao filho direito
} no23;

no23 *criaNo(int ch1, int ch2, int nchaves, no23 *pl, no23 *pc, no23 *pr){
   no23 *n;
    typedef struct n{
        int ch1,
            ch2,
            nchaves;
        struct n  *p1,
                    *pc,
                    *pr;
    } no2;
    return n;
}

void adicionaChave(no23 *no, int ch, no23 *p){   /// EU QUE FIZ
    no->lkey = ch;
}
no23 **isLeaf(no23 *no){  /// EU QUE FIZ
    no->nkeys = 0;
    return 0;
}

no23 *quebraNo(no23 *no, int val, int *rval, no23 *subarvore){
    no23 *paux;

    if (val > no->rkey) {  // val esta mais a direita
       *rval = no->rkey;   // promove a antiga maior
       paux = no->right;
       no->right = NULL;   // elimina o terceiro filho
       no->nkeys = 1;      // atualiza o número de chaves
       return criaNo(val, 0, 1, paux, subarvore, NULL);
    } else if (val >= no->lkey){ // val esta no meio
       *rval = val;        // continua sendo promovido
       paux = no->right;
       no->right = NULL;
       no->nkeys = 1;
       return criaNo(no->rkey, 0, 1, subarvore, paux, NULL);
    } else {              // val esta a mais a esquerda
       *rval = no->lkey;
       // primeiro cria o nó a direita
       paux = criaNo(no->rkey, 0, 1, no->center, no->right, NULL);
       no->lkey = val;   // em seguida arruma o nó a esquerda
       no->nkeys = 1;
       no->right = NULL;
       no->center = subarvore;
       return paux;
    }
}

no23 *find(no23 *raiz, int key) {
    if (raiz==NULL)
        return NULL;      // n�o encontrou
    if (key == raiz->lkey)
        return raiz;      // � a chave esquerda
    if ((raiz->nkeys == 2) && (key == raiz->rkey))
        return raiz;      // � a chave direita
    if (key < raiz->lkey)
        return find(raiz->left, key);
    else if (raiz->nkeys == 1)
        return find(raiz->center, key);
    else if (key < raiz->rkey)
        return find(raiz->center, key);
    else
        return find(raiz->right, key);
}
/*
// cria um nó com ch1, ch2 e nchaves, assim como os três ponteiros
no23 *criaNo(int ch1, int ch2, int nchaves, no23 *pl, no23 *pc, no23 *pr);
// verifica se o nó em questão é folha, volta 1 se sim, e 0 caso contrario
int isLeaf(no23 *no);
// coloca uma nova chave ch e arvore p, em um nó com apenas uma chave
void adicionaChave(no23 *no, int ch, no23 *p);
// Quebra um nó em dois, sendo val e subarvore, os novos dados
no23 *quebraNo(no23 *no, int val, int *rval, no23 *subarvore);

*/
// insere val em no (se necessario retorna o novo no e um valor
// rval)
no23 *insere( no23 **no, int val, int *rval){
    no23 *paux, *paux2;
    int   vaux, promov;

    if (*no == NULL) {    // arvore vazia
       *no = (no23 *) malloc (sizeof(no23));
       *no = criaNo(val, 0, 0, NULL, NULL, NULL);
             // cria no folha com um valor
       return NULL;       // nada a fazer depois
    }
    if (isLeaf(*no)){     // chegou a folha
       if ((*no)->nkeys == 1){ // caso fácil
          adicionaChave(*no, val, NULL);
          return NULL;
       } else {
          paux = quebraNo(*no, val, &vaux, NULL);
          *rval = vaux;
          return paux;
       }
    } else {             // continua a procura
       if (val < (*no)->lkey)
          paux = insere( &((*no)->left), val, &vaux);
       else if (((*no)->nkeys == 1) || (val < (*no)->rkey))
          paux = insere( &((*no)->center), val, &vaux);
       else
          paux = insere( &((*no)->right), val, &vaux);
       if (paux == NULL) // nao promoveu
          return NULL;
       else
          if ((*no)->nkeys == 1){
             adicionaChave(*no, vaux, paux);
             return NULL;
          } else {
             paux2 = quebraNo(*no, vaux, &promov, paux);
             *rval = promov;
             return paux2;
          }
     }
}



int main(){
    no23 ** aux;

}

 

  • Curtir 1
Postado

To numa duvida cruel se a funcao adiciona é assim mesmo.

 

Pois sao tres parametros que eu passo, mas so utilizo dois.

adicionado 47 minutos depois
No *CriaNovo(){
    No *aux;
    aux = malloc(sizeof(No));
    return aux;
}

Acho que o cria no deve ser assim

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...