我正在制作一棵二叉树作为我作业的一部分。
这是给定的结构:
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
}
我的build_tree函数是递归的,这是原型:
void build_tree(TreeNode** root, const int elements[], const int count);
家庭作业旨在部分测试动态分配的内存。所以当我尝试为结构中的一个指针赋值时,我的问题一直在发生。我已经看到了与此类似的问题,但它似乎从来没有完全是这个问题,但仍然涉及结构和指针。如果我误解了,我为重复的问题道歉。
build_tree方法必须以递归方式完成 这是我的代码,用于何时应将元素插入根目录的右侧:
if(elements[0] > (*root)->data){
TreeNode newnode = {elements[0], NULL, NULL}; //make a node to add
*((*root)->right) = newnode; //dereference the root.right pointer, and set to newnode (GIVES COMPILE ERROR HERE)
struct TreeNode **rightptrptr = malloc(sizeof((*root)->right)); //allocate a pointer to a pointer
*rightptrptr = (*root)->right; //dereference pointer to a pointer, assign to root.right pointer
build_tree(rightptrptr, new_elems, count - 1);
}
如果它很重要,则根节点已初始化为{整数,NULL,NULL}。
我对指针的理解并不是那么复杂,所以如果这段代码很可怕,请原谅我。
答案 0 :(得分:1)
这里有很多问题,我试着指出它们:
TreeNode newnode = {elements[0], NULL, NULL};
,这会在堆栈上分配结构,这意味着当退出函数范围时,newnode(&newnode
)的地址将不再有效。TreeNode newnode = {elements[0], NULL, NULL}
不是您想要的。这不是动态分配的对象,它位于堆栈上,并且您可以使用它将内容复制到已分配的节点。您需要始终在您的情况下分配TreeNode* node = calloc(sizeof(TreeNode))
((*root)->right) = newnode
,在这里您取消引用指向它的newnode
。它可以工作,但只有当right
指向已分配的内存时才会有效,但由于您的根将其初始化为NULL
,因此情况并非如此。您应该直接分配指针,例如root->right = calloc(sizeof(TreeNode))
struct TreeNode **rightptrptr = malloc(sizeof((*root)->right))
,在这里你分配一个指向TreeNode
的指针,因为递归函数需要这个,但你的方法是错误的。您应该将指针传递给现有的子树,而不是分配一个没有目的的子树,您可以这样做,例如&root->right
。