代码之家  ›  专栏  ›  技术社区  ›  black_pearl

C:Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)中的预排序遍历问题

  •  1
  • black_pearl  · 技术社区  · 8 年前

    我正在学习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 回复  |  直到 8 年前
        1
  •  1
  •   RayaneCTX    8 年前

    在访问之前,需要将悬挂子项初始化为空,然后:

    TreeNode seven;
    seven.data = 7;
    seven.LeftChild = NULL;
    seven.RightChild = NULL;
    

    对你创建的所有TreeNodes执行此操作它将为您减少错误。一般方法是创建一个构造函数,在调用时初始化树节点:

    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的指针,而不是将它们分配到堆栈上,因为这使得使用递归稍微不那么麻烦(我的意见)。