在C中实现非矩形数组

时间:2018-03-01 05:45:09

标签: c arrays struct

我正在尝试用C实现一个非矩形的多维数组,即:

[1, 2, [3, [4, 5, [6]]], 7]

截至目前,我正在使用这样的树:

enum item_type { ELEMENT, ARRAY };
struct item {
    int value;
    struct item *next;
    enum item_type type;
};

这可以以某种方式简化或改进吗?

编辑:更多地澄清这个练习的一部分,以“翻译”来自更高级语言的一些概念,例如以下 python 代码:

array = [1, 2, [3, [4, 5, [6]]], 7]

3 个答案:

答案 0 :(得分:4)

abstract data types方面的原因。也许你的东西比数组更像tree(或者DAG}。

首先,在非矩形"阵列上定义穷举(在纸上)所有操作" (我对它们没有确切的想法,因为你的问题很模糊)。更多地考虑如何创建,访问和修改您的东西。

然后实现该抽象数据类型。有关更简单的示例(矩阵),请参阅this。也许您可以使用flexible array memberstagged unions

阅读一些Introduction to AlgorithmsS-expressions(可能约为AST)。

答案 1 :(得分:0)

你可以把它变成通用的。而不是

int value;

你的结构可以容纳

void* data;

然后在堆上动态地为它分配空间。

答案 2 :(得分:0)

将4条评论添加到其他好答案中......所以我希望其他人能接受我的道歉......

Python允许"类型列表对象#34;要嵌入到列表中,没有要求是"矩形"说明。 C使它非常手动。

我之前使用过这种方法来实现一个非常多整数的"哈希集#34;一般格式XXXXXYYYY。我声明了一个10000个指向结构的固定数组来表示YYYY部分并动态分配链接来表示XXXXX部分... 非常快速搜索特定元素。

在你的情况下,你可以做同样的事情,甚至列表中的列表(如雪花的武器),但指针管理将是艰巨的。不是因为你的任何技能水平,而是因为" *" (2和3以及更高版本)必须正确...如果您的代码不精确,C编译器会猜测您的意思。即使是经验丰富的C级编码员也认为这项工作具有挑战性。