C中的遍历问题:线程1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)

时间:2018-07-18 03:43:53

标签: c pointers recursion

我正在学习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语言。

我不太确定问题出在哪里。

我当然搜索过,发现的在线代码对我来说太复杂了。而且我仍然尝试理解它。

任何提示都非常受欢迎。

正确的解释超出了预期。

1 个答案:

答案 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的指针,而不是将其分配在堆栈上,因为它使使用递归的麻烦略微减少(我认为)。