(二叉树)代码不工作但是 returns 编译时没有错误
(Binary tree) Code doesn't work but returns no error when compiling
编译此代码时,编译器不会return任何警告或错误,但代码根本无法运行。
函数 inserirDado 应该递归地创建节点并在 node.valor 上存储值,应用我之前设置的条件。
void inserirDado(struct node **no, int numero)
{
if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.
* no = (struct node *) malloc(sizeof(struct node));
(*no)->direita = NULL;
(*no)->esquerda = NULL;
(*no)->valor = numero;
}else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
if (numero < (*no)->valor) {
inserirDado(&(*no)->esquerda, numero);
}
else
{
inserirDado(&(*no)->direita, numero);
}
}
}
在 emOrdem,函数调用自身直到它到达叶子,然后它应该打印存储在 node.valor 的值:
void emOrdem(struct node *no)
{
if(no != NULL)
{
emOrdem(no->esquerda);
printf("%i", no->valor);
emOrdem(no->direita);
}
}
完整代码为:
#include <stdio.h>
#include <stdlib.h>
struct node
{
int valor;
struct node *esquerda;
struct node *direita;
};
void inserirDado(struct node **no, int numero);
void emOrdem(struct node *no);
int main(void) {
struct node **arvore1;
inserirDado(arvore1, 4);
inserirDado(arvore1, 2);
inserirDado(arvore1, 3);
inserirDado(arvore1, 10);
emOrdem(*arvore1);
}
//Funcao de colocar um numero aleatoria dentro de um Node.
//Ao fazer isso com varios numeros, serao criados nodos com descendentes.
void inserirDado(struct node **no, int numero)
{
if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.
* no = (struct node *) malloc(sizeof(struct node));
(*no)->direita = NULL;
(*no)->esquerda = NULL;
(*no)->valor = numero;
}else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
if (numero < (*no)->valor) {
inserirDado(&(*no)->esquerda, numero);
}
else
{
inserirDado(&(*no)->direita, numero);
}
}
}
void emOrdem(struct node *no)
{
if(no != NULL)
{
emOrdem(no->esquerda);
printf("%i", no->valor);
emOrdem(no->direita);
}
}
如果您使用 GCC 10 编译此代码,并使用开关 -W -Wextra -Wall
(顺便说一句,这不全是警告),您将得到:
<source>: In function 'main':
<source>:18:5: warning: 'arvore1' is used uninitialized in this function [-Wuninitialized]
18 | inserirDado(arvore1, 4);
| ^~~~~~~~~~~~~~~~~~~~~~~
这向您展示了问题出在哪里:您正在尝试初始化 arvore1
的位置 指向 而不是初始化 它.
另请阅读:
您必须分配缓冲区并将其分配给 arvore1
,然后再将其传递给 inserirDado
。
int main(void) {
struct node **arvore1 = malloc(sizeof(struct node*)); // add malloc()
inserirDado(arvore1, 4);
inserirDado(arvore1, 2);
inserirDado(arvore1, 3);
inserirDado(arvore1, 10);
emOrdem(*arvore1);
}
另一种选择是将 arvore1
从“指向指针的指针”更改为“指针”,
并将指向它的指针传递给 inserirDado
.
int main(void) {
struct node *arvore1 = NULL;
inserirDado(&arvore1, 4);
inserirDado(&arvore1, 2);
inserirDado(&arvore1, 3);
inserirDado(&arvore1, 10);
emOrdem(arvore1);
}
(1) 实际上你应该收到 SEG Fault 因为你还没有将 arovore1 初始化为 NULL。
(2) 这里要提的重点是,我们用双指针去掉了return值。而你在这里所做的有点自相矛盾。
--> 基本上我们将创建一个节点 (arvore1) 然后发送节点的地址 (&arvore1)
到 insertNode (inserirDado) 函数,并在其中更新相应的节点
地址到新创建的节点(temp)。
我在这里附上了工作代码。请参考此内容,如有任何疑问,您可以对其进行评论。
#include <stdio.h>
#include <stdlib.h>
struct node
{
int valor;
struct node *esquerda;
struct node *direita;
};
void inserirDado(struct node **no, int numero);
void emOrdem(struct node *no);
int main(void) {
struct node *arvore1 = NULL;
inserirDado(&arvore1, 4);
emOrdem(arvore1);
}
//Funcao de colocar um numero aleatoria dentro de um Node.
//Ao fazer isso com varios numeros, serao criados nodos com descendentes.
void inserirDado(struct node **no, int numero)
{
if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.
struct node *temp = (struct node *) malloc(sizeof(struct node));
(temp)->direita = NULL;
(temp)->esquerda = NULL;
(temp)->valor = numero;
*no = temp;
}else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
if (numero < (*no)->valor) {
inserirDado(&(*no)->esquerda, numero);
}
else
{
inserirDado(&(*no)->direita, numero);
}
}
}
void emOrdem(struct node *no)
{
if(no != NULL)
{
emOrdem(no->esquerda);
printf("%d", no->valor);
emOrdem(no->direita);
}
}
编译此代码时,编译器不会return任何警告或错误,但代码根本无法运行。
函数 inserirDado 应该递归地创建节点并在 node.valor 上存储值,应用我之前设置的条件。
void inserirDado(struct node **no, int numero)
{
if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.
* no = (struct node *) malloc(sizeof(struct node));
(*no)->direita = NULL;
(*no)->esquerda = NULL;
(*no)->valor = numero;
}else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
if (numero < (*no)->valor) {
inserirDado(&(*no)->esquerda, numero);
}
else
{
inserirDado(&(*no)->direita, numero);
}
}
}
在 emOrdem,函数调用自身直到它到达叶子,然后它应该打印存储在 node.valor 的值:
void emOrdem(struct node *no)
{
if(no != NULL)
{
emOrdem(no->esquerda);
printf("%i", no->valor);
emOrdem(no->direita);
}
}
完整代码为:
#include <stdio.h>
#include <stdlib.h>
struct node
{
int valor;
struct node *esquerda;
struct node *direita;
};
void inserirDado(struct node **no, int numero);
void emOrdem(struct node *no);
int main(void) {
struct node **arvore1;
inserirDado(arvore1, 4);
inserirDado(arvore1, 2);
inserirDado(arvore1, 3);
inserirDado(arvore1, 10);
emOrdem(*arvore1);
}
//Funcao de colocar um numero aleatoria dentro de um Node.
//Ao fazer isso com varios numeros, serao criados nodos com descendentes.
void inserirDado(struct node **no, int numero)
{
if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.
* no = (struct node *) malloc(sizeof(struct node));
(*no)->direita = NULL;
(*no)->esquerda = NULL;
(*no)->valor = numero;
}else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
if (numero < (*no)->valor) {
inserirDado(&(*no)->esquerda, numero);
}
else
{
inserirDado(&(*no)->direita, numero);
}
}
}
void emOrdem(struct node *no)
{
if(no != NULL)
{
emOrdem(no->esquerda);
printf("%i", no->valor);
emOrdem(no->direita);
}
}
如果您使用 GCC 10 编译此代码,并使用开关 -W -Wextra -Wall
(顺便说一句,这不全是警告),您将得到:
<source>: In function 'main':
<source>:18:5: warning: 'arvore1' is used uninitialized in this function [-Wuninitialized]
18 | inserirDado(arvore1, 4);
| ^~~~~~~~~~~~~~~~~~~~~~~
这向您展示了问题出在哪里:您正在尝试初始化 arvore1
的位置 指向 而不是初始化 它.
另请阅读:
您必须分配缓冲区并将其分配给 arvore1
,然后再将其传递给 inserirDado
。
int main(void) {
struct node **arvore1 = malloc(sizeof(struct node*)); // add malloc()
inserirDado(arvore1, 4);
inserirDado(arvore1, 2);
inserirDado(arvore1, 3);
inserirDado(arvore1, 10);
emOrdem(*arvore1);
}
另一种选择是将 arvore1
从“指向指针的指针”更改为“指针”,
并将指向它的指针传递给 inserirDado
.
int main(void) {
struct node *arvore1 = NULL;
inserirDado(&arvore1, 4);
inserirDado(&arvore1, 2);
inserirDado(&arvore1, 3);
inserirDado(&arvore1, 10);
emOrdem(arvore1);
}
(1) 实际上你应该收到 SEG Fault 因为你还没有将 arovore1 初始化为 NULL。
(2) 这里要提的重点是,我们用双指针去掉了return值。而你在这里所做的有点自相矛盾。
--> 基本上我们将创建一个节点 (arvore1) 然后发送节点的地址 (&arvore1) 到 insertNode (inserirDado) 函数,并在其中更新相应的节点 地址到新创建的节点(temp)。 我在这里附上了工作代码。请参考此内容,如有任何疑问,您可以对其进行评论。
#include <stdio.h>
#include <stdlib.h>
struct node
{
int valor;
struct node *esquerda;
struct node *direita;
};
void inserirDado(struct node **no, int numero);
void emOrdem(struct node *no);
int main(void) {
struct node *arvore1 = NULL;
inserirDado(&arvore1, 4);
emOrdem(arvore1);
}
//Funcao de colocar um numero aleatoria dentro de um Node.
//Ao fazer isso com varios numeros, serao criados nodos com descendentes.
void inserirDado(struct node **no, int numero)
{
if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.
struct node *temp = (struct node *) malloc(sizeof(struct node));
(temp)->direita = NULL;
(temp)->esquerda = NULL;
(temp)->valor = numero;
*no = temp;
}else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
if (numero < (*no)->valor) {
inserirDado(&(*no)->esquerda, numero);
}
else
{
inserirDado(&(*no)->direita, numero);
}
}
}
void emOrdem(struct node *no)
{
if(no != NULL)
{
emOrdem(no->esquerda);
printf("%d", no->valor);
emOrdem(no->direita);
}
}