实现可以拥有父/子的结构

时间:2015-01-11 22:03:48

标签: c

所以我试图实现一个UNIX文件系统并遇到一些麻烦,因为我之前没有使用过很多结构。我对编程很新。这就是我现在所拥有的:

typedef struct Unix{
    char *name;
    struct Unix *parentDirectory;
    struct Unix **subDirectories;
} FileSystem;

我在一个名为Unix.c的单独文件中有这个,它通过标头传递到我的main.c文件中。 parentDirectory将是指向父目录的指针,subDirectories将指向所有子目录。

我的问题是如何访问主文件中的目录和子目录。我的另一个问题如下:假设我创建了以下内容:/home/TestUser/Desktop/StephCurry/WithTheShot。如果我删除目录StephCurry,我将如何更改该目录上的所有其他父/子目录结构?我相信这与数据结构有关,但我并不是百分之百确定。

谢谢你们。我真的很喜欢进入编程,这很有趣!我在实施其中一些方面遇到了一些麻烦。

1 个答案:

答案 0 :(得分:0)

  

我的问题是如何访问目录和子目录   在我的主文件中。

// example: print given directory and all subdirectories recursively
void prdirr(FileSystem *dir)
{
    puts(dir->name);
    FileSystem **subdirp = dir->subDirectories;
    if (subdirp)
        for (; *subdirp; ++subdirp)
            prdirr(*subdirp);
}
...
    FileSystem root = { "", NULL, calloc(1, sizeof (FileSystem *)) };
    ...
    prdirr(&root);
  

我的另一个问题是:让我们说我有   创建后:/home/TestUser/Desktop/StephCurry/WithTheShot。如果我   删除目录StephCurry,我将如何更改所有其他目录   父/子目录结构在该目录之上?

您不必更改所有其他父/子目录结构 - 您只需从其父级StephCurry中删除目录subDirectories Desktop(以及free已删除的结构,如果它们已被malloc编辑,当然)。我们假设dir指向节点StephCurry

// free memory of given directory and all subdirectories recursively
void dedirr(FileSystem *dir)
{
    FileSystem **subdirp = dir->subDirectories;
    if (subdirp)
        for (; *subdirp; ++subdirp)
            dedirr(*subdirp), free(*subdirp);   // free the node
    free(dir->subDirectories);  // free the list
}
...
    // remove dir from parent's list of subDirectories
    if (dir->parentDirectory)   // won't remove root
    {
        FileSystem **subl, **subr;
        subl = subr = dir->parentDirectory->subDirectories;
        do if (*subr == dir) ++subr; while (*subl++ = *subr++);
        dedirr(dir);    // free memory of deleted dir tree
    }