← 首页·文章列表

数据结构六 数组、广义表与稀疏矩阵

一、数组的存储与地址计算

1. 数组的存储方式

2. 一维数组地址计算

若首地址为 LOC(a₁),每个元素占 L 个存储单元,则第 i 个元素的地址(从1计数):

LOC(aᵢ) = LOC(a₁) + (i - 1) × L

示例(第9题):首地址100,元素长度2,第5个元素地址 = 100 + (5-1)×2 = 108。
示例(第18题):首地址2000,元素长度3,第9个元素地址 = 2000 + (9-1)×3 = 2024。

3. 二维数组地址计算(通用公式)

设二维数组 a[m][n],下标范围行 0~m-1 或 1~m,列 0~n-1 或 1~n,首地址为 LOC,每个元素占 L 个单元。

关键:先明确下标起点和存储方式(行序/列序),再套公式。

(1) 按行序优先(行主序)存储

(2) 按列序优先(列主序)存储

通用解法三步走:

  1. 确认下标起止(从0还是从1)和元素大小L。
  2. 确认存储方式(行序/列序)。
  3. 计算目标元素前面有多少个元素,乘以L,加上基地址。

示例1(第6题):a[6][10],每个4字节,a[0][0]地址860,行优先,求a[3][5]地址。

示例2(第8题):a[1…60, 1…70],列序为主序,基地址10000,每个2字节,求a[32][58]地址。

示例3(第13题):a[1…50][1…80],基地址2000,每个2字节。

示例4(第16题):A[1…6][0…7],每个6字节,A[1][0]地址0,求数组体积、最后一个元素地址、A[2][4]行存储地址、A[5][7]列存储地址。


二、特殊矩阵的压缩存储

1. 对称矩阵压缩存储

示例(第5题):下三角按行序存放在 B[1, n(n-1)/2] 中,但题目描述有“对下三角部分中任一元素 ai,j (i≤j)”——此处 i≤j 指上三角元素,利用对称性映射到下三角。若实际存储的是下三角且按行序,对于 aᵢ,ⱼ(i ≤ j),取 aⱼ,ᵢ,位置为 j(j-1)/2 + i。但选项C i(i-1)/2+j 是标准下三角公式(i≥j)。根据给出的答案C,可判断题目实际是按行存储下三角且对 i≥j 使用,括号条件可能描述有误,实际应取i≥j。

通用公式(下三角行序,数组下标从1开始):

2. 稀疏矩阵


三、广义表

1. 广义表的定义与性质

2. 表头与表尾运算(核心)

记 Head(L) 取第一个元素,Tail(L) 取除第一个元素外剩下的元素构成的广义表。

必须牢记:

示例1(第12题):广义表 (a,b,c,d,e) 的表尾是去掉a后的剩余部分:(b,c,d,e)。注意不是 c 或 (c)。

示例2(第10题):((a,b),c,d) 表头是 (a,b),表尾是 (c,d)。

示例3(第14题):((a),((b),(c,d,e))) 表头是第一个元素 (a),表尾是去掉表头后的 (((b),(c,d,e)))。

示例4(第15题):(a,b,c) 表尾是 (b,c)。

3. Head与Tail复合运算(通用解法)

方法:从最内层括号或函数开始,逐层向外推导。每一步明确结果是原子还是广义表,是否带括号。

示例5(第2题):广义表 A=(a,b,(c,d),(e,(f,g))),求 Head(Tail(Head(Tail(Tail(A)))))。

  1. Tail(A) = (b,(c,d),(e,(f,g))) (去掉a)
  2. Tail(Tail(A)) = ((c,d),(e,(f,g))) (去掉b)
  3. Head(Tail(Tail(A))) = (c,d) (取第一个元素)
  4. Tail(Head(...)) = Tail((c,d)) = (d) (去掉c后的广义表)
  5. Head(...) = Head((d)) = d (取原子d)

示例6(第1题):L=((x,y,z), a, (u,t,w)),取出原子t。

示例7(第4题):LS=((a,b,c),(d,e,f)),取出原子e。

  1. Tail(LS) = ((d,e,f))
  2. Head(...) = (d,e,f)
  3. Tail(...) = (e,f)
  4. Head(...) = e

示例8(第17题):A=(a,b,(c,d),(e,(f,g))),求 GetHead(GetTail(GetHead(GetTail(GetTail(A)))))。

  1. Tail(A) = (b,(c,d),(e,(f,g)))
  2. Tail(...) = ((c,d),(e,(f,g)))
  3. Head(...) = (c,d)
  4. Tail(...) = (d)
  5. Head(...) = d

四、易混概念辨析

概念 要点
数组存储 行序/列序两种,地址计算注意下标起点(0或1)
对称矩阵压缩 只存下三角或上三角,元素位置 i(i-1)/2+j(行序,i≥j)
稀疏矩阵压缩目的 节省存储空间,非零元素很少且分布无规律
广义表 vs 线性表 广义表元素可为子表(可嵌套、递归),线性表元素只能是原子
表头 vs 表尾 表头是第一个元素(原子或子表);表尾一定是广义表
广义表递归 广义表可以递归定义,即元素可以是自身

五、知识速记卡

  1. 数组地址:行优先 (i×列数 + j)×L,列优先 (j×行数 + i)×L,注意下标起始。
  2. 对称矩阵:下三角行序 k = i(i-1)/2 + j(i≥j,下标从1开始)。
  3. 稀疏矩阵:压缩存储为省空间。
  4. 广义表核心:Head 取第一个,Tail 取剩余并永远带括号。
  5. 复合运算:从内向外,逐层判断是原子还是子表,注意括号的保留与去除。
  6. 表尾一定是表:(a,b,c) 的表尾是 (b,c),不是 b 或 c。