【问题标题】:C: setting up linked list using malloc() [closed]C:使用 malloc() 设置链表 [关闭]
【发布时间】:2019-07-21 09:41:02
【问题描述】:

我对链表完全陌生,并且已经完成了以下任务:

"

编写一个程序,创建一个包含 10 个 int 值(范围 从 1 到 10) 使用 malloc()。

"(这个问题还有其他部分,但与我坚持的内容无关)

我了解链表的概念,并且知道如何使用malloc()。但是,我不明白的部分是节点。

例如:如何在节点上使用malloc()以及->的含义。如果有人可以解释节点如何工作以设置 10 个 int 值的链表,那就太好了。

【问题讨论】:

  • After looking around I still don't know where to start - 从阅读课程资料开始。我们不会为你做作业。
  • @SergeyA 我有,但我无法理解它。另外,如果您阅读了我的帖子,您会发现我已经询问了有关如何开始的提示,并且没有在任何地方声明我希望有人为我完成整个事情。
  • 你不能简单地说“我无法理解它”(我的意思是,你可以,但它不会让你到任何地方)。你需要把问题分解成更小的部分,并提出具体的、有针对性的问题。您了解什么是链表(通常)吗?你知道如何动态分配内存吗?你……截至目前,这个问题几乎是一个糟糕的 SO 问题的标志性例子。
  • Google 搜索“什么是链表”和“C 中的链表”应该会提供大量有用的链接,它应该会给你很多想法。
  • 如果您已经成功创建了列表,那么下一步(如您提供的说明中提供的)似乎是遍历列表。

标签: c linked-list malloc nodes


【解决方案1】:

您基本上需要了解的是,您需要创建几个节点。让我们考虑 4 个节点。节点 A、B、C 和 D。因此,malloc() 的使用将在内存中保存这 4 个节点(显然不是按顺序)。

它是一个链表,而不是一个顺序表。这意味着您应该能够像通常在顺序列表中那样“访问”它,但它们不会按顺序保存在内存中(硬件方面)。

所以:你的节点 A 将有一个指针。该指针将指向节点 B。节点 B 指向节点 C,节点 C 指向节点 D。

A->B->C->D

记住 ALL NODES 必须有你想要的任何内容,以及指向下一个节点的指针,这样你就可以从那里访问它。

这意味着节点 A 可以位于(想象)内存中的第 4 位,节点 B 位于内存中的第 16 位,节点 C 位于内存中的第 2 位,节点 D 位于内存中的第 300 位。

例如,一个使用struct的简单示例:

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

当你插入一个新节点时,你只需要改变指针:

A->B->C->D E(你想把它插入第二个位置)。

所以你需要改变指针。比如:

 E=A->nextNode; //A is no longer pointing to B
B=E->nextNode; //Now E is pointing to B

按照您的要求使用 malloc:

struct Node* A= malloc(sizeof(struct Node));   
  struct Node* B = malloc(sizeof(struct Node));  

查看here 以更好地了解它

【讨论】:

  • 如果解释得好,点个赞吧!如果它解决了您的问题,请将其标记为答案!是的,每个节点的每个 malloc。检查编辑的答案! @OllieParsons
  • 好的,我明白了。因此,对于我的示例,我必须为每个节点使用 10 个 malloc。然后有指向每个节点的指针 = NULL。然后使用 -> ?? 分配订单然后为每个节点分配一个 int 做 A = 1, B = 4 等?
  • a->data=1例如。请记住,您正在访问 Struct 的值。 A=1不会。可以直接malloc,但是赋值给NULL是为了保证内存不会出错,如果有什么问题,它会指向NULL。您可以创建一个节点列表,然后在 for 中完成所有这些操作,但是,可以! @OllieParsons
  • (struct Node*)malloc(...)错误代码。
  • 我使用了我在答案中链接的示例,以便他更好地理解它。我认为最好写一些他可以在源代码中查看的代码,并且它会尽可能地平等。但是,是的,你是对的。 @SergeyA 我不认为这是一个糟糕的答案,以至于要否决它,真的。
【解决方案2】:

我建议你看看linux kernel linked list implementation。它非常简单,可以适用于您的任务。多个开源项目使用此实现来满足他们的需求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    相关资源
    最近更新 更多