在C中实现非矩形数组

问题描述 投票:1回答:3

我试图在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]
c arrays struct
3个回答
4
投票

abstract data types的原因。也许你的东西更像是一个tree(或者可能是一个DAG)而不是一个数组。

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

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

阅读一些Introduction to AlgorithmsS-expressions(也许关于ASTs)。


0
投票

你可以把它变成通用的。代替

int value;

你的结构可以容纳

void* data;

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


0
投票

距其他好答案添加评论4分......所以我希望别人会接受我的道歉......

Python允许“列表类型的对象”嵌入到列表中并且没有要求“矩形”的说明,这使得这非常简单。 C使它非常手动。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.