Как рекурсивно / итеративно освободить все узлы моей структуры данных? - PullRequest
0 голосов
/ 12 февраля 2019
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;

У меня есть 2 структуры, и у меня есть возможность освободить список 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);
}

, поэтому моя структура будет выглядеть так:

tests->leaf=123456789111111111111111111111;
123456789111111111111111111111->leaf = 12345678911111111111111111111111111;
.
.
.
test-fld1->leaf = a;
a->root = test-fld1;
a->next=b;
b->next=c;
c->next = NULL;

1 Ответ

0 голосов
/ 12 февраля 2019

Я думаю, у вас есть бесплатная функция для t_files_attrib.Предполагается, что он называется free_files_attrib .Я думаю, что использовать его, прежде чем освободить узел.Вы можете определить функцию с именем fr_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;
    }       
}

Для его использования вы можете вызвать ft_free по указателю test .Предполагается, что test является корнем вашей среды.

ft_free(test);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...