在C中调试我自己的binarytree adt时出现问题

时间:2018-08-08 10:52:58

标签: c

       typedef struct btNode {
            struct btNode *right;
            struct btNode *left;
            void  *data;
        } btNode_t;

       typedef struct binTree
        {
            btNode_t *root;
            btNode_t *current;

        } binTree_t;

        int buildBintree(binTree_t *tree)
            {
               tree = (binTree_t*) malloc(sizeof(binTree_t));
               if (tree == NULL)
                return ERROR;
               tree->root = NULL;
               tree->current = NULL;
               return SUCCESS;
            }

我需要在我的二叉树中插入第一片叶子,但是当我尝试创建 if 来询问tree-> current是否指向null时,我不知道为什么我的程序会崩溃在叶子创建功能中。

int buildLeaf(binTree_t *tree, void *info)
            {
                if ((tree->current) != NULL)
                    return ERROR;

                btNode_t *btnode;

                btnode = (btNode_t*) malloc(sizeof(btNode_t));

                if (btnode == NULL)
                        return ERROR;

                if (isEmptyBintree(tree))
                    tree->root = btnode;

                tree->current = btnode;

                tree->current->data = info;
                tree->current->left = NULL;
                tree->current->right = NULL;

                return SUCCESS;
            }

我的树为空,如果当前节点没有填充,我只想添加第一片叶子

        int main()
            {
               binTree_t *maple;
                int number;

                buildBintree(maple);
                buildLeaf(maple,&number);

               return 0;


            }

2 个答案:

答案 0 :(得分:2)

buildBintree应该接收双指针。使用单个指针,树将不会指向枫,而枫实际上是指向枫所指向的对象。

   int buildBintree(binTree_t **tree)
        {
           *tree = (binTree_t*) malloc(sizeof(binTree_t));
           if (*tree == NULL)
            return -1;

           (*tree)->root = NULL;
           (*tree)->current = NULL;
           return 0;
        }

在主要情况下,您需要按以下方式致电。

           int main()
            {
               binTree_t *maple;
                int number;

                buildBintree(&maple);

                buildLeaf(maple,&number);
               return 0;
            }

答案 1 :(得分:0)

关于指针没有什么特别的。

不管类型如何,为参数分配新值都不会影响您传入其值的任何变量。
(如果您buildBinTree(NULL);会发生什么?)

如果您希望函数修改某些内容,则需要向其传递将要更改的内容的地址。
因此,如果要让函数修改指针,则需要向其传递指针的地址。

int x = 0;
void fail(int* p) { p = &x; }
void succeed(int** p) { *p = &x; }

int main()
{
    int *p = NULL;
    fail(p);
    /* p is still null */
    succeed(&p);
    /* p is not null any more */
    return 0;
}