作业,在C中的结构中指定指针
我正在做一棵二叉树作为我家庭作业的一部分 这是给定的结构:作业,在C中的结构中指定指针,c,pointers,struct,C,Pointers,Struct,我正在做一棵二叉树作为我家庭作业的一部分 这是给定的结构: typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } 我的build_tree函数是递归的,这是原型: void build_tree(TreeNode** root, const int elements[], const int count); 作业的目的是部分测试动态分配的内存。因此,当我
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
}
我的build_tree函数是递归的,这是原型:
void build_tree(TreeNode** root, const int elements[], const int count);
作业的目的是部分测试动态分配的内存。因此,当我尝试为结构中的一个指针赋值时,我的问题一直在发生。我见过类似的问题,但似乎从来都不是这个问题,但仍然涉及结构和指针。如果我误解了,我为重复问题道歉
构建树方法必须递归完成
这是我的代码,用于确定何时应将元素插入根目录的右侧:
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);
}
如果这很重要,则根节点已初始化为{an integer,NULL,NULL}
我对指针的理解并不是那么复杂,所以如果这段代码太可怕,请原谅我。这里有很多问题,我将尝试指出:
,这将在堆栈上分配结构,这意味着当退出函数范围时,newnode(treenodenewnode={elements[0],NULL,NULL}
)的地址将不再有效&newnode
- 如果您需要通过动态分配节点
不是您想要的。这不是一个动态分配的对象,它位于堆栈上,并且是您可以使用它将内容复制到分配节点的唯一方法。您需要始终在您的情况下分配TreeNode newnode={elements[0]来构建树,那么NULL,NULL}
TreeNode*node=calloc(sizeof(TreeNode))
,在这里您取消引用指针以将((*root)->right)=newnode
分配给它。如果newnode
指向分配的内存,它就可以工作,但情况并非如此,因为root用户将其初始化为right
。您应该直接分配指针,例如NULL
root->right=calloc(sizeof(TreeNode))
,这里您分配一个指向指向struct TreeNode**rightprptr=malloc(sizeof((*root)->right))
的指针的指针,因为递归函数需要它,但您的方法是错误的。您应该将指针传递到现有子树,而不是毫无目的地分配一个子树,您可以这样做,例如TreeNode
&root->right
newnode={elements[0],NULL,NULL}
分配内存。该newnode
对象位于堆栈上,因此只要您所在的块离开作用域,它就会被删除(本例中的if
语句)。你需要使用malloc
,当树被清除时,正确地使用free
。这些都是有意义的,并且帮助很大。谢谢