3.1 线性结构
3.1.1 线性表
1. 线性表的定义
一个线性表是n个元素的有限序列(n大于等于0),通常表示为(a1,a2,a3,......,an)。
2. 线性表的顺序存储(顺序表)
是指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
通俗来讲线性表的顺序存储结构就是在内存中找了块地,通过占位的形式把定内存空间给占了,然后把相同数据类型的数据元素依次存放在这块空地中。
优点:可以随机存取表中的元素,按序号查找元素的速度很快。
缺点:插入和删除操作需要移动元素。插入需要把目标位置元素后元素往后移一格,为防止数据覆盖,需要从后往前进行操作,然后把空出的位置放入插入元素;删除则先删除目标元素,然后把之后的元素从前往后前移。
3. 线性表的链式存储(链表)
是指用节点来存储址可以连续,也可以不连续。节点空间只有在需要时才申请,无需事先分配。
优点:插入和删除操作不需要移动元素。
缺点:只能按顺序访问元素,不能进行随机存取。
(举例:在链式存储中,元素在内存中是分散存储的,每个元素都有一个指针指向下一个元素的位置,因此只能按顺序访问元素,而不能直接根据序号进行随机存取)
4.链表的类别
3.1.2 栈
栈和队列都是一种特殊的线性表,栈是按“后进先出”的规则进行操作的。
(1) 顺序栈:用一组地址连续的存储单元依次存储自栈顶到栈底的数据元素。
存储空间是预先定义或申请的,因此可能会出现栈满的情况。
每一个元素入栈时都要判断栈是否已满。
需要设置一个头指针指到栈顶。
需要附设指针top指示栈顶元素的位置。(若栈指针top与head指针一致,即栈满。)
(2)链栈:用链表存储栈中的元素。
栈中元素的插入和删除仅在栈顶进行,因此不必设置头节点,链表的头指针就是栈顶指针。
3.1.3 队列
队列是一种“先进先出”的线性表,队尾入队头出。
队列的顺序存储:
(1)顺序队列:
(2) 循环队列(相比于顺序队列,循环队列可以及时利用因元素出去而空出的位置。)
队列的链式存储(链队列)
为了便于操作,可以给链队列添加一个头节点,并令头指针指向头节点。
队列为空的判定条件就是头指针和尾指针的的值相同,并且均指向头节点。
3.1.4 串
字符串是一串文字及符号的简称,是一种特殊的线性表。
字符串的基本数据元素是字符,常常把一个串作为一个整体来处理。
串是仅由字符构成的有限序列,是取值范围受限的线性表。一般记为S='a1...an',其中S是串名,单引号括起来的字符序列是串值。
串长:即串的长度,指字符串中的字符个数。
空串:长度为0的空串,空串不包含任何字符。
空格串:由一个或多个空格组成的串。
子串:由串中任意长度的连续字符构成的序列称为子串。
串相等:指两个串长度相等且对应位置上的字符也相同。
串比较:两个串比较大小时以字符的ASCII码值作为依据。
串的存储结构:
(1)顺序存储:用一组地址连续的存储单元来存储串值的字符序列。
(2)链式存储:字符串可以采用链表作为存储结构,当用链表存储串中的字符时,每个结点中可以存储一个字符,也可以存储多个字符。
3.2 数组
(很简单,不用死记硬背,可以临时推导)
由于数组一般不做插入和删除,且元素个数和元素之间的关系不再发生变动,那么数组适合采用顺序存储结构。
数组元素的存储方式及相关计算
二维数组的存储结构可分为以行为主序(按行存储)和以列为主序(按列存储)两种方法。
设每个数据元素占用L个单元,m、n为数组的行数和列数,那么:
以行为主序优先存储的地址计算公式为:
Loc(aij)=Loc(a11)+((i-1)*n+(j-1))*L
以列为主序优先存储的地址计算公式为:
Loc(aij)=Loc(a11)+((j-1)*m+(i-1))*L
3.3 矩阵
这里主要讨论一些特殊矩阵的压缩存储的问题。
对多个值相同的元素可以只分配一个存储单元,零元素不分配存储单元。
下面主要讨论对称矩阵、三对角矩阵、稀疏矩阵。
3.3,1 对称矩阵
若矩阵Anxn中的元素有aij=ajii (1≤i, j≤n) 的特点,则称之为对称矩阵。
则矩阵Anxn的n**2个元素可以压缩存储到可以存放n(n+1)/2个元素的存储空间中。
假设以行为主序存储下三角(包括对角线)中的元素,并以一个一维数组B[n(n+ 1)/2]作为n阶对称矩阵A中元素的存储空间,则B[k](0≤k<n(n+1)/2)与矩阵元素aij (aji) 之间存在着对应的关系:
(同理很好理解,可以临时推导,不用背)
3.3.2 三对角矩阵
对角矩阵是指矩阵中的非零元素都集中在以主对角线为中心的带状区域中,其余的矩阵元素都为零。
下面主要考虑三对角矩阵,即只有主对角线及其左右两边为非零元素。
若以行为主序将n阶三对角矩阵Anxn的非零元素存储在一维数组B[k](0≤k<3n-2) 中,则元素位置之间的对应关系为:
k = 3X(i-1)-1+j-i+1=2i+j-3 (1≤i,j≤n)
3.3.3 稀疏矩阵
在一个矩阵中,若非零元素的个数远远少于零元素的个数,且非零元素的分布没有规律,则称之为稀疏矩阵。
可以用一个三元组(i, j, aij)唯一确定矩阵中的一个元素。