linux系统下ls -r命令的简单实现(补充部分)

缘由

如果你看懂了我的上一篇关于ls -r命令简单实现的文章后,一定会发现上一篇文章中的程序有着巨大的缺陷,因为在上一篇文章的程序中,程序执行结束后,我并没有释放存储文件和文件夹名的动态内存分配的空间,这篇是对我上一篇文章的补充,不仅修复了缺陷,而且加入了能输出 . 和 . . 文件夹名的功能,同样, . 和 . . 文件夹名我并没有存储。

// lsr.h
void file_info_list_clear(file_info_list*);     // 放入lsr.h头文件中
// lsr.c
void print(file_info_list *beg, int num)         // 修改后的print函数
{
        for (int i = 0; i < num; ++i)            // 加入了这6行代码
                printf("\t");
        printf(".\n");
        for (int i = 0; i < num; ++i)
                printf("\t");
        printf("..\n");

        while (beg != NULL) {
                for (int i = 0; i < num; ++i)
                        printf("\t");
                printf("%s", beg->name);
                if (beg->dir != NULL) {
                        printf(" :\n");
                        print(beg->dir, num+1);
                } else {
                        printf("\n");
                }
                beg = beg->file;
        }
        return;
}
void clear(void)                          // clear函数修改后
{
        while (begin != NULL) {
#ifdef TEST
                printf("path space free : %s\n", begin->ptr);
#endif
                need_free_list *net = begin->next;
                free(begin->ptr);
                free(begin);
                begin = net;
        }

        file_info_list_clear(head.dir);     // 加入了对file_info_list_clear函数的调用

        return;
}
void file_info_list_clear(file_info_list *beg)      // 递归函数 目的是释放为了存储文件和文件夹名
{                                                   // 而动态内存分配的空间
        while (beg != NULL) {
                if (beg->dir != NULL)
                        file_info_list_clear(beg->dir);
                file_info_list *next = beg->file;
#ifdef TEST
                printf("%s : clear!\n", beg->name);     // 测试代码 确定内存正确释放
#endif
                free(beg->name);
                free(beg);
                beg = next;
        }
        return;
}
上一篇:序列式容器的迭代器应当在使用时才定义


下一篇:最短路迪杰斯特拉算法