在 codechef 解决众多程序之一时,我遇到了一个问题,其中单个节点可以保存任意数量节点的地址。 即一个节点可能有一个节点或两个节点的地址......或n
节点。所以,我想到了使用链表。现在,问题是我只学到了双链表,所以我可以编写程序,我知道节点可以处理多少个地址。有一次我想到这个:
struct node
{
int n ;
for(int i=0;i<n,i++)
struct addrs[i] ;
}
但这似乎不合逻辑。因此,如果有人可以告诉我如何编写节点可以处理n
地址的结构,那将有很大帮助。
首先是你想要的(你可能需要根据编译器添加一些强制转换):
struct addrs;
struct node
{
int n;
struct addrs *a;
}
void init (struct *node, int n)
{
node->n = n;
node->a = malloc(sizeof(addrs)*n);
}
void destroy(struct *node)
{
node->n = 0;
free(node->a);
node->a = 0;
}
现在,你必须明白为什么
struct node
{
int n ;
for(int i=0;i<n,i++)
struct addrs[i] ;
}
不起作用。
struct
关键字表示您定义了一个包含结构化数据的新类型。您不能包含任何 C 可执行代码,因此其中不能包含 for 循环。
此外,在编译过程中必须知道结构的大小,如果您的示例正常工作,结构的大小node
取决于n
,并且在程序执行之前无法知道。
一旦我想到这一点,
struct node { int n ; for(int i=0;i<n,i++) struct addrs[i] ; }
不可以,不能使用语句(如循环)来声明结构的成员。此外,结构的大小必须在编译时知道,并且在运行时永远不能更改。
是所以,我想过使用链表
的,链表是实现这一点的一种可能方法。
现在,问题是我只学到了最多双链表
这不是问题。双链表的知识就足够了。
<小时 />但是,也许指针数组是更简单的选择。
由于结构的大小是静态的,但数组的大小可能会在运行时更改,因此需要动态分配数组,并在节点中存储指向它的指针。