c树结构删除问题

Red_angelX Red_angelX 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

#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堆中的路径

__AtYou__

华为OD机试 - 目录删除问题的详细解读及多语言实现(C++、Java、JavaScript、Python)

读取输入:首先读取输入的父子关系表和待删除的目录ID。构建目录树:使用字典来保存目录之间的父子关系。递归删除节点:从根节点开始,使用深度优先搜索算法遍历整个目录树,跳过待删除的节点。结果排序:将剩余的目录ID排序并输出。在这篇文章中,我们详细讲解了华为OD机试中的目录删除问题。我们通过递归深度优先搜索算法(DFS)遍历树形结构,模拟了删除文件系统中某一目录及其子目录的操作。并且通过C++、Java、JavaScript和Python四种编程语言实现了该问题的解决方案。

m0_57781768

华为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

DdddJMs__135

树结构c语言代码

包含了树结构的各种操作及相关实现方法,头文件与实现文件分离,可以很好的实现各种有关树的操作,如按层遍历,前序遍历,中序遍历,后序遍历等。

missinguu
评论 3
收藏 已收藏
分享
返回顶部
Red_angelX
C语言 70,039 成员 243,237 内容