当我们可以简单地做到这一点时,为什么要在创建链表时创建堆呢?

萨特南

我正在学习本课中的链接列表

编写器(以及每个教程中的所有其他编码器)将创建节点类型指针变量,然后使用typecasting和malloc为它们分配内存。这对我来说似乎是不必要的(当然,我知道我缺少什么),为什么我们不能使用此实现相同的东西?

struct node 
{
  int data;
  struct node *next;
};

int main()
{
  struct node head;
  struct node second;
  struct node third;

  head.data = 1;
  head.next = &second;

  second.data = 2;
  second.next = &third;

  third.data = 3;
  third.next = NULL;

  getchar();
  return 0;
}

我已经创建了节点,下一个指针指向下一个节点的地址...

danieltm64

假设您创建了一个类型node的变量my_node

struct node my_node;

您可以按my_node.data访问它的成员my_node.next因为它不是指针。但是,您的代码将只能创建3个节点。假设您有一个循环,要求用户输入一个数字并将该数字存储在链接列表中,仅当用户键入0时才停止。您不知道用户何时键入0,因此必须有一个程序运行时创建变量的方法。在运行时“创建变量”称为动态内存分配,并通过调用来完成malloc,该调用始终返回一个指针。不要忘记释放不再需要的动态分配数据,为此,请free使用由返回的指针来调用该函数。malloc您提到的教程仅说明了链表的基本概念,在实际程序中,您不会将自己限制为固定数量的节点,而是根据仅在运行时拥有的信息来调整链表的大小(除非您只需要一个固定大小的链表)。

编辑:

“在运行时创建变量”只是解释指针需求的一种高度简化的方式。调用时malloc,它将在堆上分配内存并为您提供一个地址,该地址必须存储在指针中。

int var = 5;
int * ptr = &var;

在这种情况下,ptr是一个变量(已在所有功能中声明),它包含另一个变量的地址,因此称为指针。现在考虑您提到的教程的摘录:

struct node* head = NULL;
head = (struct node*)malloc(sizeof(struct node));

在这种情况下,变量head将指向运行时在堆上分配的数据。

如果您继续在堆上分配节点,并将返回的地址分配给next链表中最后一个节点成员,则只需编写即可遍历链表pointer_to_node = pointer_to_node->next例:

struct node * my_node = head; // my_node points to the first node in the linked list
while (true)
{
    printf("%d\n", my_node->data); // print the data of the node we're iterating over
    my_node = my_node->next; // advance the my_node pointer to the next node
    if (my_node->next == NULL) // let's assume that the 'next' member of the last node is always set to NULL
    {
        printf("%d\n", my_node->data);
        break;
    }
}

当然,您可以将元素插入到链表的任何位置,而不仅仅是如上所述。请注意,尽管您唯一的名称节点是head,但其他所有节点都可以通过指针进行访问,因为您无法命名程序将拥有的所有节点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当我强行退出我的服务器(输入 clt + c)时,有什么办法可以做到这一点,客户端也会同时终止?

我们能做到这一点在Perl?

我们如何在Lambda表达式中做到这一点?

避免在Block中建立强大的参考周期,我可以简单地做到这一点吗?

当我们可以简单地分配它时,为什么在python中使用内置的copy()函数呢?

我如何做到这一点,当我在 pygame 中单击一个按钮时,我的变量只会增加一个,以及我如何做到这一点,以便文本更新

我们如何在Google工作表中做到这一点?根据条件相乘

我们需要元类来做到这一点,还是反射就足够了?

为什么工厂漫游器归零会传入属性?我如何才能做到这一点呢?

当我单击一个正方形时,我想显示一个列表,如何在javascript中做到这一点?

将编辑差异拼合到主记录上-我可以更简单或更有效地做到这一点吗?

我如何做到这一点,当我从 foreach 列表中单击一个按钮时,它只会激活该特定列表中的按钮?

我怎样才能做到这一点,当我在 tkinter 中更改标记词时,颜色会变回来?

有什么办法可以在PHP中更有效地做到这一点?

当我开始dradis时,它显示了这一点

现在支付一次,也可以选择 (!) 创建订阅——如何在 Stripe 中做到这一点?

我想为此控制器创建 Xunit 测试。我怎样才能做到这一点

我应该为管理员创建另一个模型吗?还是在Ruby on Rails中做到这一点的最佳方法是什么?

用Python的方式可以做到这一点?

我需要这个阵列解决方案,有什么办法可以做到这一点?

我如何使用Ramda.js更好地做到这一点

4次单击以关闭Ubuntu-我们可以减少这一点吗?

我可以使用C ++中的模板类来做到这一点吗?

我想附加AuthorsInfo每个名称的等级值可以做到这一点?

我可以不使用if语句中的break来做到这一点吗?

通过减小窗口大小,我的标题可以做到这一点吗?

有什么更好的方法可以做到这一点?摩尔斯电码程序

为什么不需要Google Maps API密钥来做到这一点?

为什么要使用Makefile而不是仅仅编写C来做到这一点?