c二叉搜索树中的分段错误11
尝试打印二叉树中的节点时出现分段错误。它看起来是第三个节点的问题。我搜索谷歌和堆栈溢出了几个小时,但我不明白是什么问题。我试图在C中教自己的数据结构,并且非常适合初学者,所以我可能会在某种程度上做一些事情。c二叉搜索树中的分段错误11
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *left;
struct node *right;
} Node;
typedef struct
{
Node *root;
} BinarySearchTree;
void printInOrder(Node *);
void addNode(Node *, Node *);
int main (void)
{
BinarySearchTree tree;
BinarySearchTree *tree_ptr = &tree;
Node n1, n2, n3;
n1.data = 1;
n2.data = 2;
n3.data = 3;
Node *n1_ptr = &n1;
Node *n2_ptr = &n2;
Node *n3_ptr = &n3;
tree_ptr->root = n1_ptr;
addNode(tree_ptr->root, n2_ptr);
addNode(tree_ptr->root, n3_ptr);
printInOrder(tree_ptr->root);
}
void printInOrder(Node *root)
{
if (root == NULL)
{
return;
} else
{
printInOrder(root->left);
printf("%i\n", root->data);
printInOrder(root->right);
}
}
void addNode(Node *root, Node *node)
{
if (node->data < root->data)
{
if (root->left == NULL)
{
root->left = node;
} else
{
addNode(root->left, node);
}
}
else if (node->data > root->data)
{
if (root->right == NULL)
{
root->right = node;
} else
{
addNode(root->right, node);
}
}
}
输出:
1
2
Segmentation fault: 11
似乎没有要与任何但是第三个节点的问题。如果我将添加第二个节点的行注释掉,我会得到相同的错误(显然,只打印1个)。
你的初始化是不完整的
n1.data = 1;
n2.data = 2;
n3.data = 3;
还应该设置指针
n1.data = 1;
n1.left = NULL;
n1.right = NULL;
n2.data = 2;
n2.left = NULL;
n2.right = NULL;
n3.data = 3;
n3.left = NULL;
n3.right = NULL;
为什么我不需要为n1和n2做这个工作?分段错误只发生在第三个节点(n3)。 – pariscraigm
@pariscraigm - 你应该为所有人做。使用未初始化的变量(指针变量)可能会导致崩溃,但不会**总是发生崩溃。唯一安全的是确保在使用之前进行初始化 - 始终如一。 – 4386427
谢谢你的帮助 – pariscraigm
问题发生,因为你不初始化结构Node
类型变量的所有成员。
我建议,你应该写一个函数来初始化Node
类型变量,像这样:
void init_node(Node * nodeptr, int data)
{
nodeptr->data = data;
nodeptr->left = NULL;
nodeptr->right = NULL;
}
,并在您的main()
(或任何你想要初始化),你可以简单地做:
init_node(&n1, 1);
init_node(&n2, 2);
init_node(&n3, 3);
有了这个,你绝不会错过Node
类型变量和错误发生的b的机会初始化期间分配NULL来left
和right
指针因为它会减少到更大的程度。
你在哪里初始化* full *'Node'结构?我没有看到你在任何地方设置了“左”或“右”指针。 –
如果在'add_node'函数中'node-> data == root-> data'会发生什么? –
我做错了第一个结构?还是你指的是当我在addNode函数中设置它们?我很抱歉,我对C非常陌生,并没有完全理解这个问题。 – pariscraigm