我正在学习C和数据结构。准确地进行顺序遍历。
typedef struct TreeNode{
int data;
struct TreeNode * leftChild, * rightChild;
}TreeNode ;
void pre_order_traversal(TreeNode *node){
if(node != NULL){
printf("%d", node->data);
pre_order_traversal(node->leftChild);
pre_order_traversal(node->rightChild);
}
}
void node_example(void){
struct TreeNode zero, one , five, seven , eight , nine;
zero.data = 0;
one.data = 1;
five.data = 5;
seven.data = 7;
eight.data = 8;
nine.data = 9;
seven.leftChild = &one;
seven.rightChild = &nine;
one.leftChild = &zero;
one.rightChild = &five;
nine.leftChild = &eight;
pre_order_traversal(&seven);
}
这里是问题:
线程1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT
在printf("%d", node->data);
中执行
我不擅长C指针,也不擅长C语言。
我不太确定问题出在哪里。
我当然搜索过,发现的在线代码对我来说太复杂了。而且我仍然尝试理解它。
任何提示都非常受欢迎。
正确的解释超出了预期。
答案 0 :(得分:1)
在访问之前,您需要将悬挂的子级初始化为NULL,然后:
TreeNode seven;
seven.data = 7;
seven.LeftChild = NULL;
seven.RightChild = NULL;
对创建的所有TreeNode执行此操作。它将为您最大程度地减少错误。通用方法是创建一个构造函数,该函数在调用时初始化树节点:
TreeNode *constructor(int data) {
TreeNode *T = malloc(sizeof(TreeNode));
if (T == NULL) {
/* Error */
}
T -> data = data;
T -> LeftChild = NULL; T -> RightChild = NULL;
return T;
}
我还建议使用指向TreeNode的指针,而不是将其分配在堆栈上,因为它使使用递归的麻烦略微减少(我认为)。