问题描述
我无法理解某些内容:
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}}部分的指针,因此,该内容可以指向任何内容,从而创建抽象数据结构,事情。
这仅是示例的一部分,其目的只是为了显示(我认为)如何更清楚地显示链接列表的目的和结构。不仅仅是一个节点。