C 二叉树产生分割错误

C 二叉树产生分割错误,c,segmentation-fault,binary-tree,C,Segmentation Fault,Binary Tree,我是C语言的新手,想先编写一个简单的二叉树。推送和遍历功能都有问题,但我花了两天时间才弄明白程序。当我编译并执行程序时,它显示分段错误。下面给出了代码,如有任何帮助,将不胜感激。谢谢 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <time.h> typedef struct Node { struct Node* right; struct No

我是C语言的新手,想先编写一个简单的二叉树。推送和遍历功能都有问题,但我花了两天时间才弄明白程序。当我编译并执行程序时,它显示分段错误。下面给出了代码,如有任何帮助,将不胜感激。谢谢

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

typedef struct Node
{
  struct Node* right;
  struct Node* left;
  int* value;
} Node;

Node* init()
{
  Node* t = (Node*) malloc(sizeof(Node));
  t->left = NULL;
  t->right = NULL;
  t->value = NULL;
  return t;
}

int traverse(Node* tree)
{
  printf("value : %d\n", *(tree->value));
  if (tree->left != NULL) {
    traverse(tree->left);
  } else if (tree->right != NULL){
    traverse(tree->right);
  }
}

void push(Node* n, int val)
{
  if (n->value == NULL)
  {
    *(n->value) = val;
  } else if (n->left == NULL && val < *(n->value)) {
    n->left = init();
    push(n->left, val);
  } else if (n->right == NULL && val > *(n->value)) {
    n->right = init();
    push(n->right, val);
  }
} 

int main(int argc, char const *argv[])
{
  srand(time(NULL));
  Node* tree = init();

  for (unsigned int i = 0; i < 20; ++i)
  {
    int val = rand() % 10;
    push(tree, val);
    printf("%d\n", val);
  }

  traverse(tree);
  printf("%s\n", "End Of Program!");
  return 0;
}
#包括
#包括
#包括
#包括
定义表结点
{
结构节点*右;
结构节点*左;
int*值;
}节点;
Node*init()
{
Node*t=(Node*)malloc(sizeof(Node));
t->left=NULL;
t->right=NULL;
t->value=NULL;
返回t;
}
整数遍历(节点*树)
{
printf(“值:%d\n”,*(树->值));
如果(树->左!=空){
遍历(树->左);
}else if(树->右!=NULL){
遍历(树->右);
}
}
无效推送(节点*n,int val)
{
如果(n->value==NULL)
{
*(n->value)=val;
}否则如果(n->left==NULL&&val<*(n->value)){
n->left=init();
推送(n->左,val);
}否则如果(n->right==NULL&&val>*(n->value)){
n->right=init();
推送(n->右,val);
}
} 
int main(int argc,char const*argv[]
{
srand(时间(空));
Node*tree=init();
for(无符号整数i=0;i<20;++i)
{
int val=rand()%10;
推(树,val);
printf(“%d\n”,val);
}
横移(树);
printf(“%s\n”,“程序结束!”);
返回0;
}

您从不为值分配空间。将定义更改为整数

typedef struct Node
{
  struct Node* right;
  struct Node* left;
  int value;
} Node;
然后

n->value = val;


你从不为价值分配空间。将定义更改为整数

typedef struct Node
{
  struct Node* right;
  struct Node* left;
  int value;
} Node;
然后

n->value = val;


节点
类型的
成员从不设置为除
NULL
以外的任何值。因为它的值是空指针,所以使用语句
*(n->value)=val不正确;它尝试取消对空指针的引用


如果希望
value
指向
int
,则必须为
int
分配内存,并将
value
设置为该内存的地址。如果希望
value
成为
int
,则必须更改其声明以及使用该声明的代码。

节点
类型的
value
成员决不会设置为
NULL
以外的任何值。因为它的值是空指针,所以使用语句
*(n->value)=val不正确;它尝试取消对空指针的引用


如果希望
value
指向
int
,则必须为
int
分配内存,并将
value
设置为该内存的地址。如果希望
value
成为
int
,则必须更改其声明以及使用它的代码。

int*value
是一个值得怀疑的选择,除非此链接列表旨在容纳
int
s的动态数组<代码>int值
更可能是您需要的。函数是否应该返回
int
?或者干脆
void
可能更好,但为了调试的目的,我没有打扰BTW是NULL C
NULL
中的指针是NULL指针常量。从技术上讲,它可能是
0
((void*)0)
或与之相当的东西。您不应该依赖它具有特定的形式。
int*value
是一个值得怀疑的选择,除非此链接列表旨在容纳
int
s的动态数组<代码>int值
更可能是您需要的。函数是否应该返回
int
?或者干脆
void
可能更好,但为了调试的目的,我没有打扰BTW是NULL C
NULL
中的指针是NULL指针常量。从技术上讲,它可能是
0
((void*)0)
或与之相当的东西。你不应该依赖于它有一个特定的形式,但我如何做比较,看看它是空值还是空值not@Syed.bcc在这种情况下,您不会将其与空值进行比较。它应该默认为超出您希望成为树的有效值范围的值;i、 如果你想要正的单位,默认为-1,那么我如何进行比较,看看它是空值还是空值not@Syed.bcc在这种情况下,您不会将其与空值进行比较。它应该默认为超出您希望成为树的有效值范围的值;i、 e.如果需要正UINT,则默认为-1