c树结构删除问题
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
const char* playlist[256] = {"111","222","333","44"};
typedef struct node
{
char name[256];
int playtype;
int ucValid;
int sonsize;
struct node* son[12];
struct node* parent;
};
struct node* create(struct node* item)
{
item = (struct node*)malloc(sizeof(struct node));
memset(item,0,sizeof(struct node));
return item;
}
struct node* p_node;
static int num=0;
//删除一个节点
void delete(struct node* item)
{
int i;
//struct node* tmp;
//tmp = create(tmp);
//sprintf(tmp->name,"p_node%d",num++);
//p_node = tmp;
//tmp = item;
for(i=0;i<item->sonsize;i++)
{
delete(item->son[i]);
}
free(item);
item= NULL;
}
void displaynode(struct node* item)
{
printf("============display node info=========\n");
printf("node name : %s\nnode parent :%d\nnode sonsize :%d\n",
item->name,item->parent,item->sonsize);
}
void displaytree(struct node* item)
{
int i;
if(item == NULL)
{
return;
}
for(i=0;i<item->sonsize;i++)
{
if(item->son[i] == NULL)
continue;
printf("--%s addr:0x%x\n",item->son[i]->name,item->son[i]);
if(item->son[i]->sonsize > 0)
{
printf("subnode\n");
displaytree(item->son[i]);
printf("endofsubnode\n");
}
}
}
void move(struct node* parent,struct node* item)
{
int i;
int tmp;
tmp = 0;
parent->son[parent->sonsize++] = item;
item->parent = parent;
//更新parent的ucValid信息
for(i=0;i<parent->sonsize;i++)
{
tmp |= parent->son[i]->ucValid;
}
parent->ucValid = tmp;
}
struct node* buildtree(struct node* root)
{
int i;
struct node* item;
if(root == NULL)
{
printf("error! root is null\n");
}
//创建一级菜单
for(i=0;i<4;i++)
{
item = create(item);
//给name赋值
strcpy(item->name,playlist[i]);
move(root,item);
}
return root;
}
void buildtreeitem(struct node* root)
{
int i;
struct node* item;
//测试代码
for(i=0;i<7;i++)
{
item = create(item);
sprintf(item->name,"item%d",i);
item->playtype = i;
item->ucValid = i%2;
move(root->son[0],item);
}
}
int main(int argc,char** argv)
{
printf("sizeof node :%d\n",sizeof(struct node));
struct node* root;
root = NULL;
root = create(root);
strcat(root->name,"root");
buildtree(root);
buildtreeitem(root);
displaynode(root);
displaytree(root);
//释放
delete(root);
printf("root name :%s\n",root->name);
displaytree(root);
return 0;
}
代码如上,删除函数delete只能删掉第一个节点和第一个子节点,但是如果改成
void delete(struct node* item)
{
int i;
struct node* tmp;
tmp = create(tmp);
//sprintf(tmp->name,"p_node%d",num++);
//p_node = tmp;
tmp = item;
for(i=0;i<tmp->sonsize;i++)
{
delete(tmp->son[i]);
}
free(tmp);
tmp= NULL;
}
貌似就可以删除,但是root节点还是能打印出信息来 不是NULL
另外直接free(root)好像也只free掉了name
请问究竟该怎么写删除代码? 为什么直接free不掉?
...全文
相关推荐
pta题库答案c语言之树结构7堆中的路径.zip
pta题库答案c语言 pta题库答案c语言之树结构7堆中的路径
华为OD机试 - 目录删除(C++ Java JavaScript Python)
现给定目录 ID 和其父目录 ID 的对应父子关系表[子目录 ID,父目录 ID],以及一个待删除的目录 ID,请计算并返回一个 ID 序列,表示因为删除指定目录后剩下的所有目录,返回的ID序列以递增序输出。假设,根目录的 ID 为 0,且根目录没有父目录,其他所有目录的 ID 用唯一的正整数表示,并统一编号。每个目录只有一个父目录,但每个父目录下可以有零个或者多个子目录,目录结构呈树状结构。输出一个序列,表示因为删除指定目录后,剩余的目录 ID。1、被删除的目录或文件编号一定在输入的 ID 序列中;
pta题库答案c语言之树结构8FileTransfer.zip
pta题库答案c语言 pta题库答案c语言之树结构8FileTransfer
树结构c语言代码
包含了树结构的各种操作及相关实现方法,头文件与实现文件分离,可以很好的实现各种有关树的操作,如按层遍历,前序遍历,中序遍历,后序遍历等。
数据结构四个实验(C语言一般实现,线性表的基本实现,树结构的基本实现,图结构的基本实现)
此次实验包括以下四个:C语言一般实现,线性表的基本实现,树结构的基本实现,图结构的基本实现


