c - (二叉树)代码不起作用但编译时不返回错误
问题描述
编译此代码时,编译器不会返回任何警告或错误,但代码根本不起作用。
函数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);
}
}
解决方案
(1) 实际上,您应该收到 SEG Fault,因为您尚未将 arovore1 初始化为 NULL。
(2) 这里要提到的重要一点是,我们使用双指针来摆脱返回值。你在这里所做的有点矛盾。
--> 基本上我们将创建一个节点 (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);
}
}
推荐阅读
- powershell - 如何用powershell替换txt文件开头的换行符
- postgresql - 尝试为复杂的 Postgres 查询编写 JPQL
- ios - 如何确定“NSUbiquitousKeyValueStore.default.set”结果是否成功
- javascript - 循环计算多个值
- laravel - 如何在 laravel 中为多类电子商务创建动态路由?
- javascript - Jquery复选框仅在检查取消选中然后检查时切换
- stata - 如何按组重塑数据?(状态)
- python - 右上角的 Python Panda Graph 更改值
- vue.js - 从 api laravel 读取数据后,Vuetify DataTable 可排序和过滤器不起作用
- fortran - 如何在 Fortran 子例程中使用可分配数组?