C语言链表定义理解别名 LNode 与 *LinkList 的区别前言在学习数据结构中的链表时很多初学者都会被下面这段代码困惑typedefstructLNode{intdata;structLNode*next;}LNode,*LinkList;为什么一个结构体后面有两个名字为什么LNode表示节点而 LinkList就表示指针变量为什么链表需要一个head指针指向第一个节点本文从结构体、指针和 typedef 开始逐步理解 C 语言链表的定义方式。目录一、什么是链表节点Node二、C语言中的结构体定义三、typedef 的作用四、理解 LNode 和 LinkList 的区别五、为什么链表需要 head 指针六、指针为什么可以使用 - 访问成员七、C语言和 C 链表写法区别八、总结一、什么是链表节点Node链表由多个节点组成。一个节点通常包含两个部分数据域保存数据指针域保存下一个节点的地址定义structLNode{intdata;structLNode*next;};其中intdata;保存数据。而structLNode*next;next 是一个指向下一个节点的指针变量其中存储的是下一个节点在内存中的地址。二、typedef 的作用C语言中结构体类型默认需要写structLNodenode;为了减少代码量可以使用 typedeftypedefstructLNodeLNode;相当于就是把struct LNode起了一个别名叫做LNode。之后LNode node;等价于structLNodenode;三、理解 LNode 和 LinkList 的区别重点一般的写法typedefstructLNode{intdata;structLNode*next;}LNode,*LinkList;可以拆成typedefstructLNodeLNode;typedefstructLNode*LinkList;1. LNodetypedefstructLNodeLNode;它代表一个节点。例如LNode node;表示创建一个节点这个上面讲过应该还是比较好理解的。2. LinkList重点typedefstructLNode*LinkList;注意这里有*。我一开始看到} LNode, *LinkList;这种写法时也是一头雾水为什么第二个名字前面要加个*后来把这个缩写拆开写全就可以发现*其实归属于前面的struct LNode了而不是LinkList的一部分。所以LinkList也就是一个指向LNode的指针。也就是说LinkList里面存放的其实是LNode的地址。它代表一个指向节点的指针。代码示例LinkList head;等价structLNode*head;四、为什么链表需要 head 指针链表10 → 20 → 30节点之间10知道20在哪里20知道30在哪里但是没有节点知道10在哪里。因此需要head ↓ 10 → 20 → 30head 保存第一个节点的地址。它就是链表的入口。五、为什么不能直接创建节点作为 head如果LNode head;表示创建一个节点。但是LNode*head;表示创建一个指针。链表需要的是head ↓ 第一个节点而不是让 head 本身成为节点。因为链表中的第一个节点可能发生变化。例如在执行删除第一个节点时如果使用节点而不用指针一旦删掉第一个节点就会导致链表的首地址彻底丢失在这之后找不到链表的入口。六、为什么指针可以使用 -指针能用-找到后续位置是因为它先用*顺藤摸瓜摸到了当前的节点再用.拿到了节点里存放的下一站地址。-的存在纯粹是为了让指针操作结构体时更直观、更好写。例如head-data;等价于(*head).data;过程head保存节点地址*head找到对应节点.data访问节点成员因此对象使用.指针使用-七、C语言和 C 链表写法区别C语言typedefstructLNode{intdata;structLNode*next;}LNode,*LinkList;使用LinkList head;CstructListNode{intval;ListNode*next;};总结LNode 表示节点本身LinkList 表示指向节点的指针。typedef只是换了名字真正决定它是不是指针的是*。