当我向其添加元素时,根节点会丢失吗?

Root node getting lost when i add elements to it?

所以我声明了一个指向结构的指针并将其设置为 NULL,

struct nodo * root = NULL;

然后在我创建的函数中,我将一些给定值添加到所述指针。

void add(struct nodo * root, int id, int age){
if (root== NULL){
    root= (struct nodo *)malloc(sizeof(struct nodo));
    root->id = id;
    root->age= age;
    root->prox = NULL;
}

当我使用 printf 检查我在函数中赋予指针的值时,我看到实际上它们在根指向的结构中,但是在我调用函数之后,如果我检查是否值仍然存在 returns 什么都没有。例如(主要):

            add(raiz_idoso, id, age);
            printf("%d\n", root_idoso->id);
            printf("%d\n", root)idoso->age); // this returns nothing! but if i did the same thing inside the function add, it would return the values of id and age 

谁能帮我理解我做错了什么?

这里是完整的代码,如果有帮助的话,我已经翻译了前面部分的一些内容,以便更容易理解,它是葡萄牙语的:

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

struct nodo {
    int id;
    int idade;
    struct nodo * prox;
};


void adicionar (struct nodo * raiz, int id, int idade){
    if (raiz == NULL){
        printf("oi");
        raiz = (struct nodo *)malloc(sizeof(struct nodo));
        raiz->id = id;
        raiz->idade = idade;
        raiz->prox = NULL;
    }
    else if (raiz -> prox == NULL){
        struct nodo * temp;
        raiz->prox = (struct nodo *)malloc(sizeof(struct nodo));
        temp = raiz->prox;
        temp->id = id;
        temp->idade = idade;
        temp->prox = NULL;
    }
    else{
        adicionar(raiz->prox, id, idade);
    }
}
                                                                    
void remover (struct nodo * raiz){
    if (raiz != NULL){
    raiz = raiz->prox;
    }
}


void imprimir (struct nodo * raiz, int primero){
    if (raiz == NULL && primero == 1){
        printf("fila vazia!\n");
    }
    else if (raiz != NULL){
        printf("ID: %d IDADE: %d\n", raiz->id, raiz->idade);
        imprimir(raiz->prox, 0);
    }
}

int main (void){
    char entrada;
    int id, idade, prioridade, counter;
    struct nodo * raiz_idoso = NULL;
    struct nodo * raiz_nidoso = NULL;
    scanf("%d", &prioridade);

    counter = 0;

    while(entrada != 'f'){
        scanf(" %c", &entrada);
        if (entrada == 'a'){ 
            scanf(" %d", &id);
            scanf(" %d", &idade);
            if (idade > 60){
                adicionar(raiz_idoso, id, idade);
                printf("%d\n", raiz_idoso->id);
                printf("%d\n", raiz_idoso->idade);
            }
            else if (idade < 60){
                adicionar(raiz_nidoso, id, idade);
            }
            
        }
        else if (entrada == 'r'){
            if (raiz_idoso == NULL && raiz_nidoso == NULL){

            }
            else if (raiz_idoso == NULL){
                counter = 0;
                remover(raiz_nidoso);
            }
            else if (raiz_nidoso == NULL){
                counter = 0;
                remover(raiz_idoso);
            }
            else{
                if (counter > prioridade){
                    counter = 0;
                    remover(raiz_nidoso);

                }
                else{
                    counter += 1;
                    remover(raiz_idoso);
                }
            }
        }
        else if (entrada == 'i'){
            printf("fila de idosos:\n");
            imprimir(raiz_idoso, 1);
            printf("fila de nao-idosos:\n");
            imprimir(raiz_nidoso, 1);
            printf("----------\n");
        }
    }
}

您的 add 函数将 root 声明为参数。也就是说,在add函数内部,root是一个局部变量,设置它对root的全局定义没有影响。

如果想让它直接对root的全局定义进行操作,去掉root参数即可:

void add(int id, int age) {
   ...
}

这样它将直接对 root 的全局定义进行操作。

或者,如果您不想将它硬连接到 root 的单个全局定义,您可以通过以下两种方式之一解决它。一种是return新根值:

struct nodo *add(struct nodo *root, int id, int age) {
    ...
    return root;
}

在这种情况下,调用者需要将 return 值分配给全局 root(或您想要的任何其他树根)。

实现相同效果的另一种方法是将指针传递给根指针:

void add(struct nodo **root_ptr, int id, int age) {
    ...
    *root_ptr = ...
    ...
}

对于这个版本,调用者将传递根指针的地址,而不是根指针本身。