Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何递归/迭代地释放数据结构中的所有节点?_C_Recursion_Tree_Tree Traversal - Fatal编程技术网

C 如何递归/迭代地释放数据结构中的所有节点?

C 如何递归/迭代地释放数据结构中的所有节点?,c,recursion,tree,tree-traversal,C,Recursion,Tree,Tree Traversal,我有两个结构,我有从一开始就释放t\u文件\u属性列表的功能。 第一个结构实现文件系统树。 . 树的叶子是链式列表,它存储此文件夹中的所有文件。如果文件不是文件夹或空文件夹,则它没有叶。 我必须如何遍历此结构才能释放它? 或者我如何重构代码,使树具有不同数量的叶子? 例如,我有这样的文件夹 typedef struct s_path { struct s_path *next; struct s_path *lea

我有两个结构,我有从一开始就释放
t\u文件\u属性列表的功能。
第一个结构实现文件系统树。
.
树的叶子是链式列表,它存储此文件夹中的所有文件。如果文件不是文件夹或空文件夹,则它没有叶。
我必须如何遍历此结构才能释放它?
或者我如何重构代码,使树具有不同数量的叶子?
例如,我有这样的文件夹

typedef struct              s_path
{
    struct s_path           *next;
    struct s_path           *leaf;
    struct s_path           *root;
    char                    *path;
    t_files_attrib          *attrib;
    }                       t_path;
typedef struct              s_files_attrib
{
    struct s_files_attrib   *next;
    struct s_files_attrib   *previous;

    char                    *filename;
    time_t                  timestamp;
    char                    permissions;
    char                    *owner_name;
    char                    *group_name;
    size_t                  file_size;
    size_t                  link_count;
    unsigned int            filetype;
    t_bool                  is_soft_link;
    char                    *link_pointer;
}                           t_files_attrib;
因此,我的结构将如下所示:

tests/
├── 123456789111111111111111111111
├── 12345678911111111111111111111111111
├── 12345678911111111111111111111111111111111
├── a
├── ls_out
├── test-fld1
│   ├── a
│   ├── b
│   └── c
└── test-fldr2



   void ft_path_append_vertical(t_path *pre, char *name)
    {
        t_path *path;

        path = malloc(sizeof(t_path *));
        path->root = pre;
        path->next = NULL;
        path->path = name;
        path->root = path;
        if (pre)
            pre->leaf = path;
    }
t_path *ft_path_append_horizontal(t_path *node, char *dat)
{
    t_path *nt;

    nt = malloc(sizeof(t_path *));
    if (dat)
        nt->path = ft_strdup(dat);
    nt->next = 0x0;
    if (!node)
        return (nt);
    node->next = nt;
    return (nt);
}

我想你有免费的文件属性功能。我想是的 命名为免费\u文件\u属性。我想在释放节点之前使用它。 您可以为free定义一个名为fr_free的函数,所有节点的输入都是树的根。我们可以做的自由机制类似于后序自由机制

tests->leaf=123456789111111111111111111111;
123456789111111111111111111111->leaf = 12345678911111111111111111111111111;
.
.
.
test-fld1->leaf = a;
a->root = test-fld1;
a->next=b;
b->next=c;
c->next = NULL;
要使用它,您可以在test指针上调用ft_free。假设测试是您环境的根源

void ft_free(t_path *root)
{
    if (root == NULL) return;
    ft_free(root->leaf);
    ft_free(root->next);
    if (root->leaf == NULL && root->next == NULL) 
    {
        free_files_attrib(root->attrib);
        free(root);
        root = NULL;
        return;
    }       
}

我想你有免费的文件属性功能。我想是的 命名为免费\u文件\u属性。我想在释放节点之前使用它。 您可以为free定义一个名为fr_free的函数,所有节点的输入都是树的根。我们可以做的自由机制类似于后序自由机制

tests->leaf=123456789111111111111111111111;
123456789111111111111111111111->leaf = 12345678911111111111111111111111111;
.
.
.
test-fld1->leaf = a;
a->root = test-fld1;
a->next=b;
b->next=c;
c->next = NULL;
要使用它,您可以在test指针上调用ft_free。假设测试是您环境的根源

void ft_free(t_path *root)
{
    if (root == NULL) return;
    ft_free(root->leaf);
    ft_free(root->next);
    if (root->leaf == NULL && root->next == NULL) 
    {
        free_files_attrib(root->attrib);
        free(root);
        root = NULL;
        return;
    }       
}


您应该显示填充数据结构的代码,或者最好编写一些简单的代码,用固定的示例数据创建一个小示例数据结构。@Bodo updated postIt仍然不完全清楚。也许您应该为示例文件系统树列出如何调用所有文件和目录的
ft\u path\u append\u vertical
ft\u path\u append\u horizontal
方法。似乎
t\u path
表示目录和
t\u files\u attrib
表示文件号?如果是,则可以表示树的示例如果对象是树,执行后序遍历:在释放节点本身之前释放其子节点。您应该显示填充数据结构的代码,或者更好地编写一些简单代码,用固定的示例数据创建一个小示例数据结构。@Bodo Update postIt仍然不完全清楚。也许您应该为示例文件系统树列出如何调用所有文件和目录的
ft\u path\u append\u vertical
ft\u path\u append\u horizontal
方法。似乎
t\u path
表示目录和
t\u files\u attrib
表示文件号?如果是,您已经可以表示您的树示例如果您的对象是一棵树,请执行后序遍历:在释放节点本身之前释放其子节点。如果
->root
已释放,如果
->leaf
和/或
->next
不为NULL?@Ctx是,在调用root->leaf和root->next之后移动根。感谢您关注IanAbbott,
root=NULL的目的是什么和之后的返回?我真的不明白怎么可能投票并选择那个答案^^^@bruno!代码似乎假设C支持按引用调用参数,当然它不支持。您添加了
return
,以确保退出函数。。。ok easy Chake^^^^如果
->leaf
和/或
->next
不为空,则
根目录的释放位置在哪里?@Ctx Yes,在调用根目录->叶目录和根目录->next之后移动根目录。感谢您关注IanAbbott,
root=NULL的目的是什么和之后的返回?我真的不明白怎么可能投票并选择那个答案^^^@bruno!代码似乎假设C支持按引用调用参数,当然它不支持。您添加了
return
,以确保退出函数。。。好吧,简单的笑话^^