函数获取右指针但返回NULL

时间:2016-11-04 16:48:29

标签: c pointers malloc

我在C中创建二叉树,其中我在二叉搜索树中使用索引。我找不到找到节点的函数。

我的树代码位于一个单独的文件中,它包含以下内容:

struct node {
  struct node *left;
  struct node *right;
  int index;
  void *data;
};

struct node * init_mt()
{
  struct node *root = malloc(sizeof(struct node));
  root->index = -1;
  root->data = NULL;
  root->left = root->right = NULL;
  return root;
}

void create_mt(struct node *mt, int h, int i)
{
  if (h == 0) // end of tree reached
  {
    mt->index = 0;
    mt->left = mt->right = NULL;
    return;
  }
  else 
  {
    mt->index = i;
    int l = i-pow(2,h-1);
    int r = i+pow(2,h-1);
    mt->left = malloc(sizeof(struct node));
    mt->right = malloc(sizeof(struct node));
    create_mt(mt->left,h-1,l);
    create_mt(mt->right,h-1,r);
  }
}

struct node * get_node_mt(struct node *mt, int p, int h)
{
  if (h == -1) // end of tree reached
  { 
    return NULL;
  }
  else
  {
    if (mt->index == p)
    {
      printf("Found %p\n", mt);
      return mt;
    }
    else if (mt->index > p)
    {
      get_node_mt(mt->left,p,h-1);
    }
    else
    {
      get_node_mt(mt->right,p,h-1);
    }
  }
}

当我像这样运行我的主体时(root-> left-> left是节点索引#2):

struct node *root = NULL;
root = init_mt();
create_mt(root,3,8); // root index == 8
printf("%d %p\n", root->left->left->index,root->left->left);
struct node *find;
find = get_node_mt(root,2,3);
printf("%p\n", find);

我得到以下输出:

2 0x7ffd1dd011a0
Found 0x7ffd1dd011a0
0x0

我不明白为什么我在使用root-> left->左边和内部函数get_node_mt()直接引用时得到正确的指针但是当我打印指针时我没有返回。我做错了什么?

1 个答案:

答案 0 :(得分:3)

get_node_mt()函数在两个地方调用自身。这两个地方都没有返回值。

struct node * get_node_mt(struct node *mt, int p, int h)
{
    if (h == -1) // end of tree reached
        return NULL;
    else if (mt->index == p)
        return mt;
    else if (mt->index > p)
        get_node_mt(mt->left,p,h-1);
    else
        get_node_mt(mt->right,p,h-1);
}

我重新格式化了代码并删除了很多大括号。编者应该警告这个问题,恕我直言。