先了解两个定义:
逻辑结构:抽象化的数学模型
存储结构:数据元素在计算机内部存储方式
当解决问题的时候,我们先思考该怎么把数据抽象出来模型,再试图将这些抽象模型存储进计算机。
今天要介绍的单链表属于逻辑结构中的线性结构之一:线性表。
1.什么是线性表
除第一个元素之外,每个元素都只有唯一的直接前驱。
除最后一个元素之外,每个元素都只有唯一的直接后继。
线性表分为顺序表和链表。
1.1什么是顺序表
逻辑上相邻的数据,在计算机中空间存储方式也相邻。
就像在一条每个房子紧挨着的街道上,第一个房子标记为0,第二个房子标记为1…依次递增。
这个时候有个调皮的小孩小皮,想在每个房子的墙上都画上图案,可能是数字1,2,3…也可能是字母a,b,c,d…
而由于房子都是连成的一排,小皮只要从第0个房子一直往后走就能遍历往后走就可以遍历完所有的房子。
而在计算机中,最常用数组进行顺序表的存储。
1.2什么是链表
逻辑上相邻的数据,在计算机中空间存储方式不一定相邻。
小皮又来到了一张地图上。每个房子坐落在上面,但并不像顺序表一样排成一排,而像一盘散沙。同样给每个房子标记0,1,2,3…同时,如果要从第0个房子走到第一个房子,可是两个房子又不相邻,该怎么办?
链表通过增加指针域来处理空间上不相邻的情况。
链表的逻辑存储结构
很简单,只要在第0个房子墙上记录一下第1个房子的地址就可以了。当小皮逛完了第i个房子,按照墙上的地址找到第i+1个房子。
也就是说,这个房子的墙上需要记录两个类型,一个存储标记的数值(称为数据域),另一个存储下一间房子的地址(称为指针域)。
那么有了这个逻辑结构之后,我们该怎么在计算机里实现它的存储结构呢?
链表的空间存储结构
书上一般这么写:
typedef struct LNode{
ElemType data; //数据域
struct LNode *next;//指针域