【问题标题】:Linked List implementation using C使用 C 的链表实现
【发布时间】:2020-08-14 20:16:21
【问题描述】:

我无法理解某些内容:

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

int main() {
    node* head = NULL;   /*here*/
    node* second = NULL;
    node* third = NULL;  

那行node* head = NULL; 是做什么的?它是否初始化了一个名为 head 的新 node?那为什么* 在那里,我的结构是typedefd 就像node 所以在其他情况下处理数据结构时,我应该在这种情况下使用node head = NULL

在这段代码的后面,我有

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

我猜它为该节点分配空间。而这部分

    head->info = 1;
    head->next = second;

设置头节点的数据和指针部分。我理解正确吗?

【问题讨论】:

  • 你知道指针吗?
  • 在实现链表之前,您需要对指针有很好的理解。您可能想退后一步,阅读它们,然后重新审视这个问题。
  • 花时间先熟悉基础知识,而不是一头扎进“竞争性编码”。有很多不错的C参考书和入门课程值得使用。
  • 刚开始竞争编码 + 学习链接列表 == 慢动作火车残骸。即使在专业人士中,C 语言中的链表也永远是令人头疼的问题。退后一步,真正研究指针。
  • 简短回答 - head 被设为 NULL,因为它指向一个空列表。当项目被创建然后添加到这个列表中时,它将更新为指向指针列表的开头。

标签: c linked-list


【解决方案1】:

那行“node * head = NULL;”是做什么的??

因此,node* 是一种您使用 typedef struct 代码创建的数据类型。 所以当你做 node* head 时,你实际上是在定义一个指向节点数据类型的指针。 由于最初没有实现链表,因此头部不会指向任何地方,因此它指向 NULL

请注意:head 不是新节点,它是指向数据类型 - 节点的指针

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

在这里,您是对的——我们正在为节点类型分配内存,但我们返回内存空间的地址并将其存储在 head 中。

头->信息 = 1;

head->next = 第二个;

head -> info 用于存储数据值,并且 head -> next , next 是指向我们的链表实现中的下一个节点(如果有)的指针。 next 和 head 具有相同的数据类型“node*”

【讨论】:

    【解决方案2】:

    它会初始化一个名为 head 的新“节点”吗?

    没有。它初始化一个指向某处的指针,并指示编译器这个地方必须被解释为一个“节点”结构。因此,例如,“head->info”将意味着前两个或四个或八个字节,取决于您机器上的整数大小,将被解释为整数值。

    实际上,指针然后被初始化为NULL,所以它根本不指向任何地方。

    在构建列表时,您将创建新节点,然后 head 将更新为指向这些节点中的第一个。 Head 为 NULL 意味着列表为空。

    【讨论】:

      【解决方案3】:

      也许这似乎很困难的一个原因是

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

      是 Node 的定义,而不是链表的定义。更多内容如下。

      但是node* head = NULL;head 声明为指向node 的指针,这是一个表示列表的单个节点的结构。在node 内部,info 是数据部分,可以是任何东西,比如指向一个巨大的有用数据结构的指针。在这种情况下,只是一个数字。而next 是 链接部分,并将指向列表中的下一个节点。

      在您的程序中,作为指向node 的指针,head 可以指向这样的结构,该结构具有数据部分info 字段和指向另一个节点的指针next 字段。有时也有一个指向前一个节点的指针,出于显而易见的原因,它被称为双链表。

      但这本身并不是一个链表。只是一个指向节点的指针,它现在没有指向任何东西,因为它已被初始化为 NULL。

      你可以写

      node my_node; 
      

      现在我们有了一个节点。 my_node有两个字段,可以写

      my_node.info = 1;
      my_node.next = NULL;
      

      假设你有一个只有一个节点的链表。您甚至可以使用运算符“address of”(即&符号)使head 指向它

      head = &my_node;
      

      获取my_node 的地址并放入指向node 的指针。这就是指针的意义所在。

      或者你可以写

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

      并分配一个节点大小的内存。然后head 不再是指向NULL 的指针。它是指向一个节点大小的区域的指针,可以这样使用。你现在可以写了

      head->info = -3456;
      head->next = NULL;
      

      请注意,在指针的情况下,您使用运算符-> 来访问字段,而不是上面my_node 示例中的dot,这是您程序中的局部变量。

      如果您清楚head 是什么,以及程序中声明的含义,您现在可以停止阅读。下面只是一个更完整的例子

      (可以说更有用)其他链表结构

      struct c_node
      {
          void*           data;
          struct c_node*  next;
          struct c_node*  prev;
      };
      typedef struct c_node CNode;
      
      struct c_list
      {
          char*   name;
          int     capacity;
          int     size;
          CNode*  start;
          CNode*  end;
      };
      typedef struct c_list _List;
      

      注意上面_List的例子可以得到更多的意义。一个人可以写

      _List my_linked_list;
      

      但是my_linked_list 这里有节点,一个你保持列表实际大小的参数,一个可能的容量限制,指向列表开头和结尾的指针,以使生活更简单。甚至还有名字。

      在创建列表时,您可以按照以下方式进行设置

      
      _List* create_list(const char* name, int capacity)
      {
          _List* list = (_List*) malloc( sizeof(_List) );
          list->capacity = capacity;
          list->size = 0;
          list->start = list->end = NULL;
      
          list->name = (char*)malloc(strlen(name) + 1);
          strcpy(list->name, name);
          return list;
      }
      

      只需调用即可创建一个列表

      _List* = create_list("My First 100 Nodes", 100);
      

      注意,在这种情况下,数据只是一个指针,void* data; 节点结构的一部分,CNode,所以这个东西可以指向任何东西,创建一个抽象的数据结构,一个东西的容器。

      这只是一个例子的一部分,目的只是为了更清楚地展示(我相信)链接列表的目的和结构。不仅仅是一个节点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-17
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 2015-06-03
        • 1970-01-01
        • 2016-06-10
        相关资源
        最近更新 更多