在 C 的结构中声明 n 元素

  • 本文关键字:声明 元素 结构 c
  • 更新时间 :
  • 英文 :


在 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] ;
}

不可以,不能使用语句(如循环)来声明结构的成员。此外,结构的大小必须在编译时知道,并且在运行时永远不能更改。

所以,我想过使用链表

的,链表是实现这一点的一种可能方法。

现在,问题是我只学到了最多双链表

这不是问题。双链表的知识就足够了。

<小时 />

但是,也许指针数组是更简单的选择。

由于结构的大小是静态的,但数组的大小可能会在运行时更改,因此需要动态分配数组,并在节点中存储指向它的指针。

最新更新