Why this C code is not working (binary tree)?

2

Good morning, I'm trying to create a recursive function that traverses a binary tree and finds the largest integer contained in the nodes.

My idea is to pass the pointer to the tree node, and a pointer to integer, and this pointer to integer go through the tree being compared to the other data.

In the end, this pointer will have the memory address of the largest integer in the tree, but when I press the main, it does not give the right return, the variable maior continues with the same value that I initialized. Can anyone give me a light? I hope I have explained clearly hehe.

The function in question is encontraMaior .

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

typedef int tree_info;
typedef struct no_arvbin * arvbin;
struct no_arvbin {
arvbin esq;
tree_info dado;
arvbin dir;
};

void preordem(arvbin t);
/**Ex 1**/void preordemprintafolha(arvbin t);
/**Ex 2**/void encontraMaior(arvbin t, int *maior);
void criaRaiz (arvbin t);

int main()
{
arvbin a;
a = (arvbin) malloc(sizeof(arvbin));

arvbin b;
b = (arvbin) malloc(sizeof(arvbin));

arvbin c;
c = (arvbin) malloc(sizeof(arvbin));

arvbin d;
d = (arvbin) malloc(sizeof(arvbin));

criaRaiz(a);
criaRaiz(b);
criaRaiz(c);
criaRaiz(d);

a->dado = 6;
b->dado = 3;
c->dado = 2;
d->dado = 4;

a->esq = b;
a->dir = c;

b->esq = d;
int maior;
maior = -1;

encontraMaior(a, &maior);

printf("%d", maior);
return 0;
}

void criaRaiz (arvbin t){
t->esq = NULL;
t->dir = NULL;
}
void preordem(arvbin t){
if(t != NULL){
    printf("%d\n", t->dado);
    preordem(t->esq);
    preordem(t->dir);
}
}
void preordemprintafolha(arvbin t){
if(t != NULL){
    if(t->dir == NULL && t->esq == NULL){
        printf("%d\n", t->dado);
    }
    preordemprintafolha(t->esq);
    preordemprintafolha(t->dir);
}

}
void encontraMaior(arvbin t, int *maior){
/*system("pause\n");
printf("%d ", *maior);
printf(" %p\n", maior);
system("pause");*/
if(t != NULL){
    if(*maior < t->dado){
        maior = &t->dado;
        printf("%p %p", maior, &t->dado);
    }

    encontraMaior(t->esq, maior);
    encontraMaior(t->dir, maior);
}
}
    
asked by anonymous 29.08.2018 / 16:17

1 answer

2

Apparently, the error is in these two lines:

            maior = &t->dado;
            printf("%p %p", maior, &t->dado);

I think what you wanted was this:

            *maior = t->dado;

Making this simple change, the output was 6 . See here working on ideone.

Now, I'll make some suggestions for your code.

Hide which data types are pointers through typedef is not one of the best ideas. I suggest doing your types like this:

typedef int tree_info;
typedef struct no_arvbin {
    struct no_arvbin *esq;
    tree_info dado;
    struct no_arvbin *dir;
} arvbin;

And then arvbin becomes the name you use to refer to struct while arvbin * is the pointer. In general, you only need to replace% with% with% with%.

I suggest that your arvbin function looks like this:

arvbin *criaRaiz() {
    arvbin t = (arvbin *) malloc(sizeof(arvbin *));
    t->esq = NULL;
    t->dir = NULL;
    return t;
}

I also think it's important to create a function to destroy arvbin * :

void destroiArvBin(arvbin *t) {
    if (t == NULL) return;
    destroiArvBin(t->esq);
    destroiArvBin(t->dir);
    free(t);
}

Your code looks like this:

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

typedef int tree_info;
typedef struct no_arvbin {
    struct no_arvbin *esq;
    tree_info dado;
    struct no_arvbin *dir;
} arvbin;

void preordem(arvbin *t);

/**Ex 1**/
void preordemprintafolha(arvbin *t);

/**Ex 2**/
void encontraMaior(arvbin *t, int *maior);

arvbin *criaRaiz();
void destroiArvBin(arvbin *t);

int main() {
    arvbin *a = criaRaiz();
    arvbin *b = criaRaiz();
    arvbin *c = criaRaiz();
    arvbin *d = criaRaiz();

    a->dado = 6;
    b->dado = 3;
    c->dado = 2;
    d->dado = 4;

    a->esq = b;
    a->dir = c;

    b->esq = d;

    int maior = -1;
    encontraMaior(a, &maior);

    printf("%d", maior);
    destroiArvBin(a);
    return 0;
}

arvbin *criaRaiz() {
    arvbin *t = (arvbin *) malloc(sizeof(arvbin *));
    t->esq = NULL;
    t->dir = NULL;
    return t;
}

void destroiArvBin(arvbin *t) {
    if (t == NULL) return;
    destroiArvBin(t->esq);
    destroiArvBin(t->dir);
    free(t);
}

void preordem(arvbin *t) {
    if (t != NULL) {
        printf("%d\n", t->dado);
        preordem(t->esq);
        preordem(t->dir);
    }
}

void preordemprintafolha(arvbin *t) {
    if (t != NULL) {
        if (t->dir == NULL && t->esq == NULL) {
            printf("%d\n", t->dado);
        }
        preordemprintafolha(t->esq);
        preordemprintafolha(t->dir);
    }
}

void encontraMaior(arvbin *t, int *maior) {
    /*system("pause\n");
    printf("%d ", *maior);
    printf(" %p\n", maior);
    system("pause");*/
    if (t != NULL) {
        if (*maior < t->dado) {
            *maior = t->dado;
            //printf("%p %p", maior, &t->dado);
        }

        encontraMaior(t->esq, maior);
        encontraMaior(t->dir, maior);
    }
}

See here working on ideone.

    
29.08.2018 / 16:41