我正在尝试用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]
答案 0 :(得分:4)
abstract data types方面的原因。也许你的东西比数组更像tree(或者DAG}。
首先,在非矩形"阵列上定义穷举(在纸上)所有操作" (我对它们没有确切的想法,因为你的问题很模糊)。更多地考虑如何创建,访问和修改您的东西。
然后实现该抽象数据类型。有关更简单的示例(矩阵),请参阅this。也许您可以使用flexible array members和tagged unions。
阅读一些Introduction to Algorithms和S-expressions(可能约为AST)。
答案 1 :(得分:0)
你可以把它变成通用的。而不是
int value;
你的结构可以容纳
void* data;
然后在堆上动态地为它分配空间。
答案 2 :(得分:0)
将4条评论添加到其他好答案中......所以我希望其他人能接受我的道歉......
Python允许"类型列表对象#34;要嵌入到列表中,没有要求是"矩形"说明。 C使它非常手动。
我之前使用过这种方法来实现一个非常多整数的"哈希集#34;一般格式XXXXXYYYY。我声明了一个10000个指向结构的固定数组来表示YYYY部分并动态分配链接来表示XXXXX部分... 非常快速搜索特定元素。
在你的情况下,你可以做同样的事情,甚至列表中的列表(如雪花的武器),但指针管理将是艰巨的。不是因为你的任何技能水平,而是因为" *" (2和3以及更高版本)必须正确...如果您的代码不精确,C编译器会猜测您的意思。即使是经验丰富的C级编码员也认为这项工作具有挑战性。