Binary Tree Implementation - C Language

1

I'm trying to do a tree nodes insert.

I'm using this code, but there are a number of small errors that I can not understand why the errors.

The last one is related to value1 , which is not declared. However I need my new node to get a value to make smaller and larger comparisons of the struct record to be added to the tree.

void insere_Arvore(nodo* raiz, struct registro_st registro){
    if(raiz == NULL)
        {
        return 0;
        }
    nodo* novo = (nodo*)malloc(sizeof(nodo));
    if(novo == NULL){
        return 0;
    }
    novo->dado->valor = valor1;
    novo->dir = NULL;
    novo->esq= NULL;
        if(*raiz = NULL)
        {
            *raiz = novo;
        }
    else{
    nodo* atual = *raiz;
    nodo* ant = NULL;
    }

        while(atual != NULL)
            {
            ant = atual;
            if (valor1 == atual->dado->valor){
                            free(novo);
                            return 0;
            }

        if(valor1 > atual->dado->valor)
                                    {
                    atual = atual->dir
    }
        else{
                    atual = atual->esq;
        }
        if(valor1 > ant->dado->valor)
                                    {
        ant->dir = novo;
        }
        else{
        ant->esq = novo;
        }
        if(valor > ant->dado->valor){
            ant->dir = novo;
        }
        else{
        ant->esq = novo;
        }
        }
            }
        return 1;
}

Complete code:

typedef struct registro_st{         // sequência de objetos do mesmo tipo
    char login[50];
    char nome[50];
    float valor;
    struct registro *prox;
} registro;

typedef struct nodo_st{
    registro *dado;
    struct nodo_st *dir;
    struct nodo_st *esq;
} nodo;

typedef struct Lista_st{
    nodo *cabeca;
    nodo *cauda;
    int tamanho;
} lista;

void insere_Arvore(nodo* raiz, struct registro_st registro){
    if(raiz == NULL)
        {
        return 0;
        }
    nodo* novo = (nodo*)malloc(sizeof(nodo));
    if(novo == NULL){
        return 0;
    }
    novo->dado->valor = valor1;
    novo->dir = NULL;
    novo->esq= NULL;
        if(*raiz = NULL)
        {
            *raiz = novo;
        }
    else{
    nodo* atual = *raiz;
    nodo* ant = NULL;
    }

        while(atual != NULL)
            {
            ant = atual;
            if (valor1 == atual->dado->valor){
                            free(novo);
                            return 0;
            }

        if(valor1 > atual->dado->valor)
                                    {
                    atual = atual->dir
    }
        else{
                    atual = atual->esq;
        }
        if(valor1 > ant->dado->valor)
                                    {
        ant->dir = novo;
        }
        else{
        ant->esq = novo;
        }
        if(valor > ant->dado->valor){
            ant->dir = novo;
        }
        else{
        ant->esq = novo;
        }
        }
            }
        return 1;
}
    
asked by anonymous 23.07.2017 / 05:22

1 answer

3

There are several things that are not very correct.

  • In order to be able to modify the root within the function, a pointer must be passed to the pointer instead of a normal pointer (#).

  • It is incorrect to use returns with 0 or 1 values in a void function.

  • The loop / cycle should only be used to get to the correct node at the insertion made only after that.

Soon the code should look like this:

//A raiz passou a **raiz, e registro a *registro
void insere_Arvore(nodo **raiz, struct registro_st *registro) {
    nodo* novo = malloc(sizeof(nodo)); //agora sem cast pois é desnecessário
    if(novo == NULL){
        return; // é void logo não pode ter tipo de retorno
    }

    novo->dado = registro; //o dado é o registro todo em si
    novo->dir = NULL;
    novo->esq= NULL;

    if(*raiz == NULL){ //ver se o valor do ponteiro é null, logo arvore vazia
        *raiz = novo;
        return;
    }

    nodo* atual = *raiz;
    nodo* ant = NULL;

    while(atual != NULL){ // laço/ciclo agora só para navegar até ao sitio correto
        ant = atual;

        //o valor a ser inserido vem no próprio registro, com registro->valor
        if (registro->valor == atual->dado->valor){
            free(novo);
            return; // é void logo não pode ter tipo de retorno
        }

        if(registro->valor > atual->dado->valor){
            atual = atual->dir;
        }
        else{
            atual = atual->esq;
        }
    }

    //após navegar é feita a inserção pelo no anterior.
    if (registro->valor > ant->dado->valor){ //se maior que o anterior fica a direita
        ant->dir = novo;
    }
    else { //senão fica a esquerda
        ant->esq = novo;
    }
}

The main course will also look a bit different:

int main(){
    nodo *arvore = NULL;

    registro *reg = malloc(sizeof(registro));
    strcpy(reg->nome, "O nome aqui");
    strcpy(reg->login, "O login aqui");
    reg->valor = 10;


    insere_Arvore(&arvore, reg); 
    //            ^-- agora com o endereço de arvore

    //...
    
23.07.2017 / 14:16