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