C语言结构体自引用 图解教程 C语言结构体自引用 图解教程小白版C语言结构体全局结构体变量与局部结构体变量示例代码#includestdio.h// 定义结构体类型struct Stu同时定义全局变量 s1、s2structStu{//学生的相关属性charname[20];intage;}s1,s2;// s1,s2 是全局变量intmain(){structStus3;// s3是局部变量定义在main函数内部return0;}一、自引用是什么一句话 一张图一个结构体里藏一个指向自己这种类型的指针让它能像糖葫芦一样一个个串起来就是链表。structNode{intdata;structNode*next;// 指向另一个同类型的Node};Mermaid 图解三个节点怎么串起来的指向指向尾巴Node1data10next●Node2data20next●Node3data30nextNULL结束看懂这张图每个方框是一个 Node方框里的next就是那个指针● 表示指向下一格的门牌号箭头就是顺着 next 找到下一个。ASCII 示意图更贴近内存的样子Node1 Node2 Node3 --------------- --------------- --------------- | data 10 | | data 20 | | data 30 | | next ------------ | next ------------ | next NULL | --------------- --------------- --------------- ↑ ↑ ↑ 从这出发 顺着箭头走到这里 这里到头停二、为什么只能放指针不能直接放自己图解核心直接放自己会无限套娃编译器算不出大小直接报错。// ❌ 错误structNode{intdata;structNodenext;// 套娃死循环};NodeNode里的NodeNode里的Node里的Node...无穷无尽...放指针就对了因为指针只占固定大小一张门牌号纸条纸条上只写一行地址Nodedatanext: 纸条另一个Node记忆点指针是一张记地址的纸条只占8个字节直接放自己是把整个屋子搬进来会套娃。三、指针 next 是怎么指过去的动态图structNoden1{10,NULL};structNoden2{20,NULL};n1.nextn2;// 把n2的地址写到n1的next里用一张 Mermaid 图表达游标 p 一路走的过程p从n1出发p p-next 往后挪p再往后挪指针pdata10data20NULL循环结束代码对应的每一步structNode*pn1;// p 先指向 n1while(p!NULL){printf(%d ,p-data);// 打印当前指向的数据pp-next;// p 顺着 next 挪到下一个}游标p像一个手电筒一直往下一格照照到空的NULL就停下来。四、完整可运行例子 内存图解#includestdio.hstructNode{intdata;structNode*next;};intmain(){structNoden1{10,NULL};structNoden2{20,NULL};structNoden3{30,NULL};n1.nextn2;// 串起来n2.nextn3;structNode*pn1;while(p!NULL){printf(%d ,p-data);pp-next;}printf(\n);return0;}运行结果10 20 30p 一开始在这里 ▼ [10] ──► [20] ──► [30] ──► NULL ▲ ▲ ▲ │ pnext │ pnext │ 遇到NULL循环结束五、给小白的三张记忆卡片放自己放指针结构体自引用里面放 指针 next为什么是指针?无限套娃 报错 ❌只占固定8字节 ✅指针用箭头访问 p-data遍历: p p-next走到 NULL 结束六、易错点配图记更牢自引用成员必须带*struct Node* next;最后一个节点的 next 要置 NULL否则游标一路乱走会崩溃c.nextNULL;// 给链表打上终点站标记指针访问成员用-别写成p.next遍历条件是while(p ! NULL)不是while(p)出错就跑飞。七、一句话总结自引用 结构体里放一个指向同类型的指针像手电筒一样从第一个节点一路照到 NULL就能把零散的节点串成一条灵活的链表。