繁体   English   中英

C malloc指向NULL的指针不起作用

[英]C malloc to pointer to NULL not working

我正在编写一个在二叉搜索树中插入新节点的函数。 为了避免有太多的 if-else,我使用了一个名为nodeSide的指针,它指向节点的左侧或右侧,如下所示:

void insertHelper(Node *node, int val) {

  Node *nodeSide;
  if (val < node->val) {
    nodeSide = node->left;
  } else {
    nodeSide = node->right;
  }

  if (nodeSide == NULL) {
    nodeSide = (Node *)malloc(sizeof(Node));
    nodeSide->val = val;
    nodeSide->left = NULL;
    nodeSide->right = NULL;
    return;
  }
  else {
    insertHelper(nodeSide, val);
  }
}

但是,实际上并未添加该节点。 似乎这样做:

Node *node =  malloc(...);
node->left = NULL;
Node *anotherNode = nodeLeft;
anotherNode = malloc(...);

实际上并没有向树添加新节点。 任何想法为什么? 指针应该指向正确的位置,无论它是否为空。 还是我在这里错了?

这是我的完整代码:

#include <stdlib.h>
#include <stdio.h>

typedef struct _node {
  int val;
  struct _node * left;
  struct _node * right;
  int ht;
} Node;


void insertHelper(Node *node, int val) {

  Node *nodeSide;
  if (val < node->val) {
    nodeSide = node->left;
  } else {
    nodeSide = node->right;
  }

  if (nodeSide == NULL) {
    nodeSide = (Node *)malloc(sizeof(Node));
    nodeSide->val = val;
    nodeSide->left = NULL;
    nodeSide->right = NULL;
    return;
  }
  else {
    insertHelper(nodeSide, val);
  }
}

Node * getNode(int value) {
  Node * node = (Node * )malloc(sizeof(Node));
  node->val = value;
  node->left = NULL;
  node->right = NULL;
  node->ht = 0;
  return node;
}

Node * getTree() {
  Node *root = getNode(3);
  Node *rootLeft = getNode(2);
  root->left = rootLeft;
  Node *rootRight = getNode(4);
  root->right = rootRight;
  Node *rootRightRight = getNode(5);
  rootRight->right = rootRightRight;
  return root;
}

int main() {

  Node * root = getTree();

  insertHelper(root, 6);

  // to verify:
  printf("%d", root->right->right->right->val);

  return 0;
}

您的代码不会存储您在树中任何位置创建的新节点。

也许你可以做例如

if (nodeSide == NULL) {
    nodeSide = (Node *)malloc(sizeof(Node));
    nodeSide->val = val;
    nodeSide->left = NULL;
    nodeSide->right = NULL;
    if (val < node->val)
       node->left = nodeSide;
    } else {
       node->right = nodeSide;
    }
    return;
  }

但是您可以使用双指针,以避免额外的 if/else :

  Node **nodeSide;
  if (val < node->val) {
    nodeSide = &node->left;
  } else {
    nodeSide = &node->right;
  }

  if (*nodeSide == NULL) {
    *nodeSide = (Node *)malloc(sizeof(Node));
    (*nodeSide)->val = val;
    (*nodeSide)->left = NULL;
    (*nodeSide)->right = NULL;
    return;
  }
  else {
    insertHelper(*nodeSide, val);
  }
}

您的insertHelper似乎在return之前缺少一行相关的代码:

node->left = nodeSide;

但请记住在哪一边添加值。 也许您应该在函数内部将相关侧作为变量进行跟踪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM