【问题标题】:Creating a linked list without declaring node as a pointer创建链表而不将节点声明为指针
【发布时间】:2016-10-30 16:30:44
【问题描述】:

我已经在谷歌和一些教科书上搜索了一段时间,但我似乎无法理解为什么在构建链表时,节点需要是指针。

例如。如果我有一个节点定义为:

typedef struct Node{
    int value;
    struct Node *next;
} Node;

为什么要创建一个链表,我会说:

Node *a = malloc(sizeof(Node));
Node *b = malloc(sizeof(Node));
a->value = 1;
b->value = 2;

a->next = b;
b->next = NULL;

而不是:

Node a, b;
a.value = 1;
b.value = 2;

a.next = &b;
b.next = NULL;

据我了解,列表仍然可以正常引用和遍历,唯一的区别是使用点、& 语法而不是箭头?

【问题讨论】:

  • 您的Node *a, *b sn-p 无效。您正在声明指针变量,而不是让它们指向有效内存。指针几乎肯定不会指向有效的Node 对象
  • 在第二个示例中,考虑如何将数百个新节点添加到列表中。使用指针,您可以继续使用 malloc 在循环中添加新节点。如果没有指针,那么您需要以其他方式分配存储空间,这在一定程度上抵消了使用链表的好处。

标签: c linked-list


【解决方案1】:

您可以按照您提到的方式创建列表。

但您必须关心列表成员的生命周期。如果你的

节点a,b;

在函数的范围内,然后在该函数返回后这些将丢失。

当您使用指针时,您通常会使用堆,并且实例会一直存在,直到它们被删除。

【讨论】:

    【解决方案2】:

    您的第一个示例不起作用。您正在声明两个 Node 指针。但是,由于您没有将它们初始化为任何东西,因此尊重它们是非法的,因为它们不指向任何东西。您必须首先使用malloc 之类的东西来声明它们指向的内存,或者将它们分配给先前声明的局部变量。但是,您还必须记住在使用完内存后致电free

    在第二个示例中,您声明了两个Node 变量,用于存储Node 的实例。如果它们是局部变量,它们将在堆栈上分配,并且只要它们在范围内,它们就会存在。它们拥有有效的内存,因此您可以按照您演示的方式使用它们。

    【讨论】:

    • 我的错误。但是假设我已经为 a 和 b 分配了所需的空间,例如,如果我在“Node *a,*b”下面有两个 malloc 语句.. 那个例子之间的即将发生的差异是什么一个链表和我提到的第二个?
    猜你喜欢
    • 2020-07-20
    • 2015-10-19
    • 1970-01-01
    • 2015-06-15
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多