关于树的内存释放问题,方法都试过了,老是死掉,谁来帮我看看啊
我就不bb了,直接代码,就是后面的节点释放有问题,本来是语法分析的节点树,我简化成一棵小树了,所有的次序都试过了,先儿子(左右节点交换)后指针(指针顺序、逆序),先指针后儿子(左右节点交换)都不行,实在没办法了,老是在第二个free出错,谁帮我看看
#include <stdio.h>free;C语言;内存释放;
#include <stdlib.h>
#include <string.h>
typedef struct Node
{
char* id;
char* name;
char* value;
struct Node* lchild;
struct Node* rchild;
}Node;
Node* Init();
Node* CreateNode();
void Free(Node* root);
int main()
{
Node* root;
root = Init();
root->lchild = CreateNode();
root->lchild->id = (char*)malloc(sizeof(strlen("lid"))+1);
strcpy(root->lchild->id, "lid");
root->lchild->name = (char*)malloc(sizeof(strlen("lname"))+1);
strcpy(root->lchild->name, "lname");
root->lchild->value = (char*)malloc(sizeof(strlen("lvalue"))+1);
strcpy(root->lchild->value, "lvalue");
root->lchild->lchild = NULL;
root->lchild->rchild = NULL;
/*
//节点只有一部分指针分配内存
root->lchild = CreateNode();
root->lchild->id = (char*)malloc(sizeof(strlen("lid"))+1);
root->lchild->name = NULL; //(char*)malloc(sizeof(strlen("lname"))+1);
root->lchild->value = (char*)malloc(sizeof(strlen("lvalue"))+1);
root->lchild->lchild = NULL;
root->lchild->rchild = NULL;
*/
//按照释放顺序来分配右儿子节点内容
root->rchild = CreateNode();
root->rchild->id = (char*)malloc(sizeof(strlen("rid"))+1);
strcpy(root->rchild->id, "rid");
root->rchild->name = (char*)malloc(sizeof(strlen("rname"))+1);
strcpy(root->rchild->name, "rname");
root->rchild->value = (char*)malloc(sizeof(strlen("rvalue"))+1);
strcpy(root->rchild->value, "rvalue");
root->rchild->lchild = NULL;
root->rchild->rchild = NULL;
/*
//不按照释放的顺序来分配右儿子节点内存:
root->rchild = CreateNode();
root->rchild->name = (char*)malloc(sizeof(strlen("rname"))+1);
root->rchild->value = (char*)malloc(sizeof(strlen("rvalue"))+1);
root->rchild->id = (char*)malloc(sizeof(strlen("rid"))+1);
root->rchild->lchild = NULL;
root->rchild->rchild = NULL;
*/
Free(root);
return 0;
}
Node* CreateNode()
{
Node* temp = (Node*)malloc(sizeof(Node));
temp->id = NULL;
temp->name = NULL;
temp->value = NULL;
temp->lchild = NULL;
temp->rchild = NULL;
return temp;
}
Node* Init()
{
Node* temp = (Node*)malloc(sizeof(Node));
temp->id = (char*)malloc(sizeof(strlen("rootid"))+1);
strcpy(temp->id, "rootid");
temp->name = (char*)malloc(sizeof(strlen("rootname"))+1);
strcpy(temp->name, "rootname");
temp->value = (char*)malloc(sizeof(strlen("rootvalue"))+1);
strcpy(temp->value, "rootvalue");
temp->lchild = NULL;
temp->rchild = NULL;
return temp;
}
void Free(Node* root)
{
Node* temp;
temp = root;
if (temp != NULL)
{
Free(temp->rchild);
Free(temp->lchild);
if (temp->id != NULL)
{
printf("%s:%d:\n", temp->id, strlen(temp->id));
free(temp->id);
temp->id = NULL;
}
if (temp->name != NULL)
{
printf("%s:%d:\n", temp->name, strlen(temp->name));
free(temp->name);
temp->name = NULL;
}
if (temp->value != NULL)
{
printf("%s:%d:\n", temp->value, strlen(temp->value));
free(temp->value);
temp->value = NULL;
}
free(temp);
temp = NULL;
}
}