在C语言中的结构体、指针和树

3

我们操作系统课程的最终学期项目要求每个人都实现一个伪“Linux文件系统”。目的是模拟处理文件、文件夹、更改目录等操作。

我不喜欢在C语言编程时使用字符串和指针,令我不安的是,这个项目似乎需要两者皆用。由于我对指针相对陌生,因此希望能得到一个内部树状结构的后端实现是否正确的审查。

typedef struct floorNode
{
    char floorName[30]; //the name of the tree node
    struct floorNode *parentPointer; //this is a pointer to the parent node. Null for the root node.
    struct floorNode *childPointers[10]; //this is an array holding pointers to up to 10 child nodes. 
    char fileArray[10][30]; //this is an array of 10 'files', each of up to length 30.
                            //for this assignment, strings are the only type of "file"

} floorNode;

这是在C语言中实现树的正确方式吗?

8
如果你不喜欢使用指针,那么在C语言中你将无法做许多事情。顺便说一下,大多数语言都有指针,只是试图通过称之为引用来隐藏它们,但大多数相同的问题也适用。 - mu is too short
@mu太短了 - 我更喜欢引用,虽然这可能只是我更多的经验在说话。 - Raven Dreamer
你只需要一个文件系统,限制一个目录下的文件和子目录数量不超过10个,这是可以的。我认为存储节点的绝对名称没有意义。希望你能理解为什么。 - J.S. Taylor
@J.S. Taylor,它会彻底破坏'ls'命令的结果。是的,我也得出了这个结论。 - Raven Dreamer
@Raven:但是引用只解决了空指针问题,并且通常可以帮助您解决内存管理问题。指针最棘手的部分之一是必须处理指向同一事物的多个指针,而引用在这方面无法帮助您。而且这可能不是说您不喜欢指针的最佳网站 :) - mu is too short
1
@mu 太短了 - 哎呀。我猜至少我喜欢递归? - Raven Dreamer
2个回答

1

那基本上是正确的数据类型。

我对fileArray [][ ]有所担忧。除非我误解了它的目的,否则我认为它是不必要的。要获取子项的floorName,可以遍历childPointers []以获取子项中的名称。

如果节点具有30个字符的字符串,则需要考虑将所有节点的存储空间稍微增大一点,例如31个字符,这样就始终存在一个尾随NUL,并且无需进行特殊的处理来区分没有NUL的30个字符字符串和所有较短的带有NUL的字符串。


文件数组是为那些不是floorNodes的子节点而设计的(在我的情况下,它们只是简单的字符串)。现在,我赌Stack Overflow很快就会有另一个关于我抱怨树不起作用的问题 :P - Raven Dreamer

0

你可能想要一个子节点的链表。你绝对不想使用指针数组来实现这个功能。你还应该考虑如何判断一个文件是否为目录。


你是在建议每个节点都有一个子节点的链表吗? - Raven Dreamer
@Raven Dreamer - 是的。我也认为目录和普通文件都是文件,应该作为相同类型的节点出现在树中。 - Elliott Sprehn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接