【问题标题】:Is there a more efficient way to store an n-ary tree in a file in C?有没有更有效的方法将 n 叉树存储在 C 中的文件中?
【发布时间】:2015-05-31 09:07:56
【问题描述】:

假设我正在编写一个冒险游戏。该地图由不同类型的瓷砖组成。我有形成路径的瓷砖,以及形成门的瓷砖,等等。

我将使用一个结构来描述一个图块的类型和内容,以及它连接到哪些其他图块。

然后我将创建一个四重链表将它们连接在一起。

但是一个描述房间的结构体将比描述门的结构体包含更多的元素,所以一个门结构体中的许多元素都是多余的。我可以制作一个较小的门结构,但结构只能指向相同类型的结构*,所以我无法将房间结构连接到门结构。冗余可能可以忽略不计,但我想知道是否还有其他方法。

另一种选择是使用结构数组,但是我会有很多“填充”结构浪费更多空间。但是,数组会使从文件中读取和重新构建地图变得更加容易。

有什么办法可以绕过结构只能指向同类型结构的限制吗?还是我没有提到这个问题的另一种常见解决方案?

我的一个想法是每个图块都可以有指向其他所有类型图块的指针。有些可能是多余的,但与上面的选项相比,它的冗余度会更低。

*我的意思是,通常在链表中,结构包含指向与其所在类型相同的结构的指针。

【问题讨论】:

  • 结构可以指向任何类型的对象。为什么说它们“只能指向同类型的结构”?
  • @Marc 通常在链表中,每个结构都有一个指针,指向它所在的相同类型的结构。我正是这个意思。就我而言,我有不同类型的结构。

标签: c arrays struct


【解决方案1】:

你真的不必有一个统一的结构来描述一切。相反,您可以执行以下操作(这有点像用 C 编写自己的 C++ 虚拟表,并且使用非常广泛)。

您的基本 tile 结构可能如下所示:

struct tile
{
    // common tile stuff
    ...
    enum tile_type type;
    void *type_info;
};

因此,在这个结构中,您存储了每种图块类型共有的内容。然后为其他类型创建其他结构:一个用于房间,一个用于路径等。在tile 的对象中,您使enum 描述实际类型,并将指向具体类型的指针存储在void *.


有许多链接描述了这种技术的变体。 Here的一个。

【讨论】:

  • 这是个好主意。从文件读取后,我仍然需要以某种方式索引元素,但我什至没有考虑过使用 void 指针。谢谢! :)
【解决方案2】:

不要将元素存储在 tile 中,而是仅存储指向元素链表的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    相关资源
    最近更新 更多