数组的内存结构是线性的,通过这个例子的实现也更加容易理解。数组是一种常用的也是固定内存排序线性结构。然而在很多情况下是数据在内存中并不会这样线性的去排布。
虽说C语言是面向过程的语言,事实上这只是一种表象,学了数据结构其实我们可以发现我们完全可以用 C语言 实现面向对象语言的特性。事实上几乎所有的操作系统内核、机器语言底层、编译器层面都是使用 C语言 来实现的。
链表链表是一种元素内存空间离散排列的线性数据结构。它的内存存储示意图大致如下:

链表是整个数据结构的一个基础,后面的线性结构几乎都需用到链表的知识,下面就从这几个方面来介绍链表。
定义
分类
算法
优缺点
【链表定义/特点】
n个节点离散分配
彼此通过指针相连
每个节点只有一个前驱节点,每个节点只有一个后续节点
首节点没有前驱节点,尾节点没有后续节点
首节点:
第一个有效节点
尾节点:
最后一个有效节点
头结点:
第一个有效节点前面的那个节点,头结点并不存放有效数据,加头结点的目的主要是为了方便对链表的操作,头结点的数据类型和首节点一样
头指针:
指向头结点的指针变量
尾指针:
指向尾节点的指针变量
确定一个链表需要的最少的参数有哪些?
根据链表的示意图可以简单推出来所有该链表的信息。
实际上只需要一个关键信息:头指针
因为我们通过头指针就可以推算出链表的其他所有信息。
【节点的表示】
// 代码的表示如下 typedef struct Node{ int data; //数据域 struct Node *pNext; // 指针域 - 指向相同类型的下一个节点 }*PNODE,NODE; // PNODE 等价于 struct Node * , NODE 等价于 struct Node 【只需要拿到 pNext 指针就能推算出整个链表】
【链表的分类】
链表可以分为如下类别:
单链表 -- 上面的实例
双链表 -- 每个节点有两个指针域,分别指向前后两个节点

循环链表 -- 能通过任何一个节点找到其他所有节点的链表,环形链表
非循环链表 -- 非环形普通列表
【关于链表的常见算法】
常见算法有:
创建链表
遍历
查找
清空
销毁
求长度
排序
删除节点
插入节点
·····
下面就逐步讲一下各个算法的思路,用为算法的方式来帮助理解
1 创建链表
创建链表,首先需要确定链表的长度 int length 然后根据长度创建对应个数的节点,并把新创建的节点挂到链表的最后。简单来说就是:
1 创建头结点
2 循环创建新节点挂到链表尾部