C语言数据结构《顺序表》教案
数据结构 教案设计
| 题目:顺序表 | 授课时长:2学时(90分钟) |
|---|---|
| 授课班级:24应用1班、24应用2班 | 主讲教师:黄建楼 |
| 学情分析 | 学生已掌握数组基本操作,但理解顺序表动态特性有困难。常见问题: 1. 混淆数组长度与容量概念 2. 忽略插入删除时的元素移动开销 3. 对扩容机制缺乏设计意识 需通过内存操作可视化强化连续存储认知 |
| 教学目标 | • 掌握: 1. 顺序表三要素(基地址/长度/容量) 2. 增删改查操作的实现与时间复杂度 3. 动态扩容策略 • 熟悉: 1. 顺序表在实时系统中的应用场景 2. 元素移动的性能影响 • 了解: 1. CPU缓存局部性原理与顺序表性能优势 |
| 教学重点 | 1. 插入删除操作的元素移动机制 2. 倍增扩容策略的实现 3. 随机访问特性与时间复杂度分析 |
| 教学难点 | 1. 批量元素移动的边界条件处理 2. 扩容时的数据迁移策略 3. 长度与容量的动态平衡 |
| 教学方法 | 1. 类比教学:用"火车车厢"类比连续存储 2. 动态演示:动画展示元素移动过程 3. 案例驱动:医院挂号系统实现 4. 缺陷分析:对比链表操作劣势 |
| 板书设计 |
第二章 顺序表
一、结构定义(三要素)
typedef struct {
ElemType *elem; // 基地址
int length; // 当前元素数
int capacity; // 总容量
} SqList;
二、核心操作
- 插入:O(n)
[图示] ██A██B██ → ██A█▓█B██ (元素后移) - 删除:O(n)
[图示] ██A▓B██ → ██AB██ (元素前移) - 访问:O(1)
addr_i = base_addr + i*size
三、扩容策略
固定增量 vs 倍数扩容(1.5x/2x)
均摊时间复杂度O(1)
| 教学过程 | 教师活动与教学内容 | 学生活动 | 教学意图 | 时间 |
|---|---|---|---|---|
| 一、概念导入 (生活类比) |
1. 对比两种存储方式: - 连续座位(顺序表) - 分散座位(链表) 2. 分析查询效率差异 3. 演示内存连续存储优势 |
讨论随机访问场景 列举顺序存储适用案例 |
建立直观认知 理解设计动机 |
10min |
| 二、结构实现 (编码演示) |
1. 定义SqList结构体 2. 实现初始化函数: c<br>Status InitList(SqList *L, int size){<br> L->elem = malloc(size*sizeof(ElemType));<br> if(!L->elem) exit(OVERFLOW);<br> L->length = 0;<br> L->capacity = size;<br> return OK;<br>}3. 动态演示内存分配 |
绘制内存布局图 标注关键字段 |
掌握核心结构 理解内存管理 |
20min |
| 三、关键操作 (难点突破) |
插入操作: 1. 边界检测(pos有效性) 2. 扩容判断(length==capacity) 3. 元素后移算法: c<br>for(int i=L->length; i>pos; i--)<br> L->elem[i] = L->elem[i-1];删除操作: 1. 元素前移算法: c<br>for(int i=pos; i<L->length-1; i++)<br> L->elem[i] = L->elem[i+1];扩容实现: 1. 新容量 = 旧容量 * 2 2. realloc数据迁移 |
计算不同位置插入的移动次数 设计扩容测试用例 |
掌握算法实现 强化边界处理 |
30min |
| 四、项目实战 (医院挂号系统) |
需求分析: 1. 按号插入(急诊优先) 2. 完成就诊删除记录 3. 实时显示等待队列 任务要求: 1. 实现动态扩容(2倍增容) 2. 支持指定位置插入 3. 内存释放处理 |
分组实现: - 初始化队列 - 插入急诊患者 - 删除完成就诊 - 打印当前队列 |
应用知识解决实际问题 培养工程能力 |
20min |
| 五、性能分析 | 1. 测试不同操作耗时: - 尾部插入:O(1) - 头部插入:O(n) 2. 对比链表操作效率 3. 分析CPU缓存优势 |
运行测试程序 记录实验数据 |
理解数据结构选择依据 | 10min |
| 课堂小结 | 1. 顺序表核心特性: - 随机访问高效 - 内存连续存储 - 容量动态管理 2. 时间复杂度分析: - 访问O(1) - 插入/删除O(n) 3. 适用场景: - 高频访问 - 尾部操作多 |
|||
| 作业布置 | • 基础题: 1. 实现顺序表去重算法 2. 设计环形缓冲区(固定容量) • 应用题: 对比不同扩容策略在10万次插入中的性能差异 • 思考题: 分析C++ vector扩容策略设计原理 |
|||
| 课后反思 | 1. 插入操作边界条件需加强训练 2. 增加内存泄漏检测实践环节 3. 下节课引入Redis动态数组案例 |
教学资源设计
graph TD
A[顺序表] --> B[结构定义]
A --> C[基本操作]
B --> D[内存布局]
C --> E[插入删除]
C --> F[扩容机制]
E --> G[元素移动]
F --> H[倍增策略]
D --> I[连续存储优势]
G --> J[时间复杂度]
H --> K[均摊分析]
重点难点突破策略
-
元素移动可视化
初始状态: [A][B][C][D][ ][ ] length=4 在位置1插入X: 步骤1:移动元素 [A][B][C][D][ ] → [A][B][C][ ][D] 步骤2:插入元素 [A][X][B][C][D] 移动次数 = length - pos -
扩容过程代码演示
void Expand(SqList *L){ int new_cap = L->capacity * 2; // 2倍增容 ElemType *new_base = realloc(L->elem, new_cap*sizeof(ElemType)); if(!new_base) exit(OVERFLOW); L->elem = new_base; L->capacity = new_cap; } -
时间复杂度对比表
操作 顺序表 链表 随机访问 O(1) O(n) 头部插入 O(n) O(1) 尾部插入 O(1) O(1) 中部插入 O(n) O(n) 内存占用 无指针开销 额外指针空间
教学特色
-
渐进式实践体系
graph LR A[概念理解] --> B[单操作实现] B --> C[完整功能开发] C --> D[性能优化] -
错误预防机制
- 插入位置校验:
if(pos < 0 || pos > L->length) return ERROR; - 扩容失败处理:
if(!new_base) { printf("Alloc fail!"); exit(1); } - 内存释放:
free(L->elem);
- 插入位置校验:
-
行业应用案例
- MySQL InnoDB缓冲池使用顺序结构
- 游戏开发中的对象池实现
- 实时系统中的数据采集缓存

浙公网安备 33010602011771号