5.数组和广义表
数组的顺序存储表示
- 存储
1 | // 数组的顺序存储表示 |
- 操作
1 | // 构造数组 |
1 | // 数组销毁 |
1 | // 定位元素的相对地址 |
1 | // 取给定下标元素的值 |
1 | // 给指定下标的元素赋值 |
矩阵的压缩存储:特殊矩阵、稀疏矩阵
特殊矩阵
(以下推导请见王道 3.4.3 节)
注意下标(以下推导基于矩阵元素 a 从 (1, 1) 开始,但存储从 0 号开始)(题目会以此设置陷阱)
对称矩阵
存储结构:一维数组
sa[n*(n+1)/2]
,(行序为主序,仅仅存储下三角)存储下标
k
与矩阵逻辑位置(i, j)
的关系 \[ k = \left \{ \begin{aligned} & \frac{i(i-1)}{2}+j-1, &i \ge j\\ & \frac{j(j-1)}{2}+i-1, &i < j \\ \end{aligned} \right. \]
下三角矩阵
存储结构:一维数组
sa[n*(n+1)/2 + 1]
,(行序为主序,存储下三角及上三角的常量【存储在数组最后一个位置】)存储下标
k
与矩阵逻辑位置(i, j)
的关系
\[ k = \left \{ \begin{aligned} & \frac{i(i-1)}{2}+j-1, &i \ge j &(存储下三角和主对角线)\\ & \frac{n(n+1)}{2}, &i < j &(存储常量的位置)\\ \end{aligned} \right. \]
上三角矩阵
存储结构:一维数组
sa[n*(n+1)/2 + 1]
,(行序为主序,存储上三角及下三角的常量【存储在数组最后一个位置】)存储下标
k
与矩阵逻辑位置(i, j)
的关系
\[ k = \left \{ \begin{aligned} & \frac{(i-1)(2n-i+2)}{2}+j-i, &i \le j &(存储上三角和主对角线)\\ & \frac{n(n+1)}{2}, &i > j &(存储常量的位置)\\ \end{aligned} \right. \]
三对角矩阵
描述:所有非 0 元素都集中在以主对角线为中心的 3 条对角线区域,其余元素为 0
存储结构:一维数组
sa[3n-2]
,(按行优先,依次存入一维数组中)存储下标
k
与矩阵逻辑位置(i, j)
的关系
\[ k = 2i + j -3 \]
\[ \begin{align} & i = \lfloor(k+1)/3+1\rfloor \\ & j = k-2i+3 \end{align} \]
稀疏矩阵
三元组顺序表
- 存储
1 | // 稀疏矩阵的三元组顺序表存储表示 |
- 操作
1 | // 算法 5.1 |
1 | // 算法 5.2 |
行逻辑连接顺序表
- 存储
1 | // 行逻辑连接顺序表 |
- 操作
1 | // 算法 5.3 |
十字链表存储
- 存储
1 | // 稀疏矩阵的十字链表存储表示 |
- 操作
1 | // 算法 5.4 |
1 | // 矩阵加法 |
广义表的定义和存储结构
- 存储
1 | /* 广义表的头尾链表存储表示 */ |
1 | /* 广义表的扩展线性链表存储表示 */ |
- 操作
1 | // 算法 5.5 |
1 | // 算法 5.6 |
1 | // 算法 5.7 |
1 | // 算法 5.8 |
参考资料
- 数据结构(C语言版).严蔚敏
- 2020年数据结构考研复习指导.王道论坛