结构体变量的定义与初始化 typedef链表指针类型小白图解两种等价的写法目的都是用typedef造出一个链表节点指针的别名linklist。写法①typedefstructNode{intdata;structNode*next;// 自引用指针}*linklist;写法②和①完全等价structNode{intdata;structNode*next;};typedefstructNode*linklist;大白话typedef 就是给一个类型起外号。上面是把struct Node*指向Node的指针起了个外号叫linklist以后写代码直接写linklist就等于写struct Node*。二、typedef 起了什么作用图解typedef 起外号struct Node*linklist以后写 linklist 就用它更简洁对应关系linklist p;// 等价于 struct Node* p;linklist head;// 等价于 struct Node* head;一张图看懂两种写法是一回事写法2写法1等价typedef struct Node {...} * linklist;struct Node {...}; 然后 typedef struct Node* linklist;三、结构体变量的定义三种方式有了类型之后怎么造出实际的变量// 方式1先定义类型再定义变量最常用推荐structNode{intdata;structNode*next;};structNoden1;// 定义一个结构体变量n1// 方式2定义类型的同时直接定义变量structNode{intdata;structNode*next;}n2;// 末尾直接写变量名// 方式3用typedef的别名来定义变量typedefstructNode*linklist;linklist p;// p是一个指向Node的指针图解这三种方式的区别指针变量p (指针)只存某个Node的地址普通变量n1 (结构体变量)里面有自己的data和next核心区别struct Node n1;创建的是实实在在的节点有自己的data、next两块内存linklist p;或struct Node* p;创建的是指针只记一个地址不真正拥有节点数据。四、结构体变量的初始化重点1. 普通结构体变量直接赋初值structNoden1{10,NULL};// data10, nextNULL花括号里的值按成员顺序依次赋值第1个给data第2个给next。2. 结构体指针变量初始化structNoden1{10,NULL};structNode*pn1;// 指针p指向n13. 链表里最常用的初始化malloc动态创建structNode*head(structNode*)malloc(sizeof(structNode));head-data10;// 指针用-访问成员head-nextNULL;图解这三种初始化的内存样子初始化3 malloc动态创建head(指针)堆上节点data10nextNULL初始化2 指针指向已有变量n1data10p(指针) 指向n1初始化1 直接给值n1data10nextNULL五、易错点提醒小白最常踩坑别把linklist当普通结构体变量用linklist是struct Node*的别名它本身是指针不是节点。写linklist head;后head还没有属于自己的节点内存必须malloc或用已有变量赋值。定义指针和定义变量是两回事structNoden;// n是节点真的占了内存structNode*p;// p是地址还不指向任何节点危险初始化不要漏NULL链表尾节点的next记得置NULL否则遍历会越界崩溃。typedef写法括号位置别记错}*linklist;// 括号结束后紧跟* linklist表示指针类型六、一句话总结typedef 给struct Node*起别名linklist让指针写法更简洁定义普通结构体变量 真的创建节点定义指针变量 只存地址初始化可以直接给值{10,NULL}、让指针指向已有变量pn1、或用malloc动态创建再-赋值。