🤖 Assistant
1 2 3 4 5 6 7 8
| # 🧮 第五章:数组与广义表 · 从青铜到王者养成指南
## 🌟 一、数组:整齐划一的「数据方阵」
### 1.1 🧱 数组基础认知  ```c int classroom[5] = {85,92,78,90,88}; // 典型的「数组宿舍楼」
|
📌 核心特点
特点 |
解读 |
🔒 同质化 |
所有「房间」住同类型数据 |
🚌 连续存储 |
内存地址连续(门牌号相邻) |
🎯 随机访问 |
通过下标可直接定位到具体元素 |
1.2 🏗️ 高维数组建模秘籍
🔢 二维数组地址计算(行优先)
★ 公式密码:Loc(A[i][j]) = Loc(A[0][0]) + (i*n + j)*size
假设5x4矩阵中每个元素占4字节:
1 2
| 地址 = 200 + (2*4 + 3)*4 = 200 + 11*4 = 244 ✔️
|
🗺️ 存储策略对比
策略 |
存储方式 |
适用场景 |
行优先存储 |
按行展开(类似读书顺序) |
C/C++、Python |
列优先存储 |
先排完一列再下一列 |
Fortran语言 |
1.3 🦸♂️ 特殊矩阵的「瘦身术」
🔀 对称矩阵压缩
只需存储对角线及一侧元素:
1 2 3 4
| 原矩阵: 存储数组: 1 2 3 1 2 4 5 ➔ 2 4 3 5 6 3 5 6
|
🌲 稀疏矩阵的三元组表示
1 2 3 4 5 6
| struct Triple { int row; int col; int value; };
|
🌌 二、广义表:会「变身术」的数据魔法师
2.1 ✨ 魔法特性
- 🌀 魔法元素:可以是原子(基本数据项)或子表
- 🎭 形态自由:支持空表、嵌套、递归结构
- 🕳️ 深度定义:嵌套层数(原子深度为0,空表情深度为1)
2.2 🌀 结构解密
头尾表示法 vs 层次表示法

终极挑战:计算深度
1 2 3
| 1. a → 深度0(原子) 2. (b,(c,d)) → 分解后得到(c,d),深入一层 → 总深度 2+1=3 ✔️
|
2.3 🔧 核心操作工具箱
1 2 3 4 5
| public class GList { Object head; GList tail; }
|
📊 三、考古现场:数组 vs 广义表
对比维度 |
数组 |
广义表 |
战场解析 |
🔢 元素类型 |
严格统一 |
混合类型自由搭配 |
广义表更灵活 |
🧠 存储结构 |
线性的物理连续 |
递归的逻辑链接 |
数组访问更快 |
🚀 操作效率 |
删改耗时O(n) |
动态操作更高效 |
各有适用场景 |
🎮 典型应用 |
图像处理、矩阵运算 |
人工智能、语法分析 |
领域分工明确 |
🧩 四、思维导图脑暴中心
1 2 3 4 5 6 7 8 9 10
| mindmap root((高阶数据结构)) 数组--> 特点["🔑 同质 | 连续 | 随机访问"] 数组--> 分类["📦 一维 → 多维 → 特殊矩阵"] 数组--> 操作["⚡ 查改O(1) | 插删O(n)"] 广义表--> 特性["🌀 递归 | 嵌套 | 灵活结构"] 广义表--> 表示法["🔖 头尾 ↔ 层级"] 广义表--> 魔法操作["🎩 取头/尾 | 求深度"] 应用场景--> 数组应用["📷 图像存储 | 矩阵运算"] 应用场景--> 广义表应用["🤖 AI决策树 | 编译器解析"]
|
💡 学习效果自测(含答案)
二维数组A[8][10]采用行优先存储,首地址200,每个元素占4字节,求A[3][5]地址?
➔ 展开计算:200 + (310 +5)4 = 200 + 35*4 = 340 ✅
广义表L=((a,b), (c,(d,e)))的深度是多少?
➔ 最深层是(d,e)所在位置:深度为3 ✅
对对称矩阵进行压缩存储的目的是什么?
➔ 节省存储空间 + 提升访问效率 ✅
🌟 提示:尝试用不同编程语言实现广义表的基础操作,能加深理解哦!
```
✨ 学习锦囊:建议配合可视化工具(如Data Structure Visualizations网站)观察数组和广义表的动态操作过程,理论结合实践效果更佳!