代码中`head->next = second;`的工作原理及链表指针赋值疑问
链表节点指针赋值逻辑解析
先把你的代码整理成可直接阅读的版本:
#include <stdio.h> #include <stdlib.h> struct node { int data; struct node *next; }; int main() { struct node *head; struct node *second; struct node *third; head = (struct node *)malloc(sizeof(struct node)); second = (struct node *)malloc(sizeof(struct node)); third = (struct node *)malloc(sizeof(struct node)); head->data = 1; head->next = second; second->data = 2; second->next = third; third->data = 3; head->next = NULL; return 0; }
针对你问的head->next = second;这行代码,拆解一下逻辑:
先明确几个基础概念:
struct node结构体里的next是一个指针变量,它的作用就是存储另一个struct node类型节点的内存地址。head是一个指针,它指向你用malloc分配的第一个节点(一块独立的内存空间)。head->next就是直接访问这个第一个节点里的next成员。second同样是一个指针,它存储的是第二个节点的内存地址(malloc分配的第二块独立空间)。
这行代码的执行逻辑:
就是把second指针里存的第二个节点的内存地址,直接赋值给head指向的第一个节点的next成员。
换句话说,做完这步操作后,第一个节点的next指针就指向了第二个节点,两者就被“链”在了一起——你可以通过head->next直接访问到第二个节点的内容。纠正你的误解:
不存在“head指向next”这回事。head本身就是指向第一个节点的指针,next只是第一个节点内部的一个成员,用来记录下一个节点的位置。
另外提一句,你代码最后一行head->next = NULL;会把之前的链接覆盖掉,这会导致第一个节点和第二个节点的关联被切断,虽然第二、第三个节点的内存还在,但你没法通过head去访问它们了。
内容的提问来源于stack exchange,提问作者Ashitosh bendre
相关产品推荐
相关产品推荐

