【问题标题】:why a variable of linked list must be a pointer [closed]为什么链表的变量必须是指针
【发布时间】:2019-12-17 05:04:25
【问题描述】:

我有一个代码如下:

#include<stdio.h>

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

int main(){
    node *a;
    return 0;
}

谁能向我解释为什么 a 必须是指针而不是变量类型节点?谢谢你的帮助

【问题讨论】:

  • 谁/在哪里说它必须是一个指针?没有这样的规则。这取决于代码的上下文。
  • @kaylum 你能告诉我在什么上下文中我们使用指针,在什么上下文中我们使用常规变量吗?
  • 指针只是一个普通变量,它将地址保存到其他东西作为它的值。您可以声明一个结构,并将在堆栈上保留存储您可以通过声明的变量访问该结构或将其地址分配给一个指针。使用链表,通常不会在堆栈上声明内存,但通常您会为每个节点分配内存中的存储空间。您将节点在内存中的地址分配给一个指针。您还可以使用指针来遍历节点(例如struct *p = node; while (p != NULL) { p = p-&gt;next; }),这是另一种常见的列表用途。
  • Singly Linked List (node only, no wrapper)Singly Linked List of Integers (example) 比较,它提供了一个 head 指针(指向列表中第一个节点的指针)和一个 tail 指针(指向列表中最后一个节点的指针)以避免不得不迭代以在末尾插入下一个节点。

标签: c data-structures linked-list


【解决方案1】:

链表的下一个节点由struct node *next;给出

根据定义,这必须是一个指针。您不能在 struct node 的另一个变量中包含 struct node 的变量

typedef struct node{
    int value;
    struct node next;   //-- Not Allowed
}node;

上述声明将无法编译,因为struct node 的大小将是无限的。

链表的 head 可能是非指针,但这会不必要地使代码复杂化,因为您需要将两个代码段分别用于 head 和其他节点。 p>

【讨论】:

    【解决方案2】:

    简答:

    在“C”中,参数传递是按值完成的。为了允许被调用的函数对数据结构进行更改,或与将来对数据结构的更改保持同步,向函数传递一个指向对象的指针。

    长答案: 考虑一个调用者和一个被调用者函数,其中被调用者必须更改链表上的第一个元素。由于被调用者将被传递给链表头节点的副本,因此它对 head->next 所做的更改是在副本上完成的。 “调用者”函数“head1”未修改,当callee 返回时,更改(和malloc)丢失。

    void callee(struct node head)
    {
        struct node new_node = malloc(...)
        new_node = head.next ;
        head->next = new_node ;
    }
    
    void called(void) {
        struct node head1 = ...
        callee(head1) ;
    } ;
    

    附带说明一下,对于以下情况,技术上可以使用“结构节点”来表示链表(对被调用者)。但是,这里有一些反对在同一代码中使用两种表示的论点,并记住要使用哪一种是recipe for disaster

    • 被调用者没有修改链表head 项。
    • 如果被调用者存储链表以供将来调用(例如静态变量),则不能修改链表。

    我的个人建议,始终使用指针

    【讨论】:

      【解决方案3】:

      在 C 中链表被用作动态数组。与 C 中的普通数组不同,它不必具有特定的大小,并且可以根据需要不断扩展或减小。

      由于结构节点有 2 个数据成员:

      1.它存储的数据(int值)

      2.下一个位置的地址(*next)

      所以为了让链表工作,我们将“a”声明为一个指针,这样只有一个变量 我们可以用它来遍历整个列表。我们可以简单地将“a”指向列表中的下一个元素,以便我们可以访问它。 我们可以使用我假设为

      的基本元素
         struct node node;
      

      这样我们就可以指向它以到达列表的开头,因为它是单链表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        相关资源
        最近更新 更多