我有一个问题......如果我有这样的Binarytree:
typedef struct
{
char* text;
char* line;
struct Node* left;
struct Node* right;
}Node
并有一个启动功能:
Node *start(Node* ptr)
{
if(ptr == NULL)
{
ptr = (Node*)malloc(sizeof(Node));
ptr->text = "some text";
ptr->line = "another text";
ptr->left = NULL;
ptr->right = NULL;
}
return (ptr);
}
在二进制树中添加左子项的功能,如果root不为空,在这里我必须给出我的文本和行动态内存。
Node* addNode(Node* ptr)
{
if(ptr != NULL)
{
Node* leftNode = (Node*)malloc(sizeof(zeiger));
char* text = (char*) malloc(100*sizeof(char));
char* line = (char*) malloc(100*sizeof(char));
line = "some text 2";
text = "another text";
if(leftNode !=NULL)
{
leftNode->text = text;
leftNode->line = line;
leftNode->right = NULL;
ptr->left = leftNode;
}
return leftNode;
}
return ptr;
}
现在问题是我想要释放树中的所有东西,所以我有一个像这样的函数,如果左或右或root不是NULL就自称。所以我看到一些代码,我应该释放根,而不是数据。
void freeTree(Node* root)
{
while(1)
{
if(root == NULL)
{
break;
}
else if (root->left != NULL)
{
freeTree(root->left);
root->left = NULL;
}
else if (root->right) {
freeTree(root->right);
root->right = NULL;
}
else
{
free(root);
}
}
}
MAIN.C
int main(int argc, char const *argv[]) {
Node* root = NULL;
root = start(root);
root = addNode(root);
freeTree(root);
return 0;
}
答案 0 :(得分:2)
你不应该释放你没有malloc
的记忆。
这里第一个节点的指针指向一个字符串文字。你不应该打电话给free()
。
您还应该在初始节点中分配内存,然后尝试复制该字符串文字。现在每个节点都相似。
现在你释放每个节点的内存。首先要做哪个节点?邮政订单遍历将是一个。首先是孩子,然后父母将被释放,否则你将有内存泄漏。
void freeTree(Node *root){
if( root ){
freeTree(root->left);
freeTree(root->right);
free(root->text); // root->text was allocated calling malloc
free(root->line); // same for root->line
free(root);
}
}
root->文本已分配,调用malloc - 您必须动态分配才能在其上调用free
。在您的代码中,初始节点text
指向字符串文字。你需要按照回答中提到的那样正确地做 - (分配 - 并将字符串复制到新分配的内存中)。