使用C实现链表

问题描述

我无法理解某些内容

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吗?那么为什么*在那里,我的结构就typedef就像node一样,所以在其他情况下,当处理数据结构时,在这种情况下我应该像node head = NULL那样使用。

代码之后,我有

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

我猜想它为那个节点分配了空间。而这部分

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

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

解决方法

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

不。它将 pointer 初始化为某个位置,并指示编译器该位置必须被解释为“节点”结构。因此,例如,“ head-> info”将意味着前两个,四个或八个字节(取决于计算机的整数大小)将被解释为整数值。

实际上,然后将指针初始化为NULL,因此它根本没有指向任何地方。

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

,

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

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

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

head =(结构节点*)malloc(sizeof(node))

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

head-> info = 1;

head-> next =秒;

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

,

这似乎很难的原因之一是

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

是节点的定义,而不是链表的定义。详情请见下文。

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

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

但这不是链接列表本身。只是一个指向节点的指针,由于它已被初始化为NULL,所以它现在没有指向任何对象。

你可以写

my_node

现在我们有一个节点。 my_node.info = 1; my_node.next = NULL; 有两个字段,您可以编写

head

并说您只有一个节点的链表。您甚至可以通过使用运算符“地址”(&)来写head = &my_node; 指向它,

my_node

,它使用node的地址并放入指向head = (node*) malloc( sizeof(node) ); 的指针中。这就是指针的用途。

或者您可以写

head

并仅分配节点大小的内存。然后NULL不再是指向head->info = -3456; head->next = NULL; 的指针。它是指向节点大小的区域的指针,因此可以使用。您现在可以写

->

请注意,在使用指针的情况下,您使用运算符dot来访问字段,而不是像上面my_node的示例那样使用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的{​​{1}}部分的指针,因此,该内容可以指向任何内容,从而创建抽象数据结构,事情。

这仅是示例的一部分,其目的只是为了显示(我认为)如何更清楚地显示链接列表的目的和结构。不仅仅是一个节点。