《数据结构C语言:单向链表-链表基本操作(尾插法建表、插入)》15分钟试讲教案【模版】

《数据结构C语言:单向链表-链表基本操作(尾插法建表、插入)》15分钟试讲教案

一、试讲基本信息

  1. 授课对象:大学本科计算机/软件工程专业低年级学生(掌握C语言结构体、指针基础)
  2. 试讲时长:15分钟
  3. 教学目标
    • 知识目标:理解尾插法建表的核心逻辑,掌握表头插入、表中插入的指针操作原理。
    • 能力目标:能复述尾插法、插入操作的步骤,能识别核心代码的指针指向逻辑。
    • 素养目标:体会链式存储"动态链接"的思想,培养指针操作的逻辑思维。
  4. 教学重难点
    • 重点:尾插法建表的尾指针作用,表头/表中插入的"先链后断"原则。
    • 难点:插入操作中指针指向的顺序(避免指针丢失)。

二、教学过程设计(15分钟)

1. 复习导入(2分钟)

  • 回顾:单向链表的节点结构(数据域+指针域),带头节点链表的初始化(头指针指向头节点,头节点next为NULL)。
    板书/PPT展示节点结构体定义:

    c 复制代码
    typedef struct LNode {
        int data;
        struct LNode *next;
    } LNode, *LinkList;
  • 提问导入:"初始化空链表后,如何按输入顺序创建链表?插入元素时又该如何保证链表不'断裂'?"引出本节课核心:尾插法建表、链表插入操作。

2. 核心知识点1:尾插法创建链表(5分钟)

(1)逻辑讲解(2分钟)
  • 核心思想:新增"尾指针"跟踪链表最后一个节点,新节点始终插入到尾节点之后,保证输入顺序与链表存储顺序一致。
  • 步骤拆解(结合手绘节点图):
    ① 初始化带头节点的空链表,尾指针rear初始指向头节点;
    ② 新建节点,输入数据,指针域置NULL;
    ③ 原尾节点的next指向新节点;
    ④ 尾指针rear更新为新节点;
    ⑤ 重复②-④,直到创建完所有节点。
(2)代码演示+讲解(3分钟)

展示核心代码,逐行解析关键逻辑:

c 复制代码
// 尾插法创建链表(n为元素个数)
void CreateList_Tail(LinkList *L, int n) {
    InitList(L); // 初始化空链表(头节点)
    LNode *rear = *L; // 尾指针初始指向头节点
    for (int i = 0; i < n; i++) {
        LNode *p = (LNode *)malloc(sizeof(LNode)); // 新建节点
        if (p == NULL) { // 新增:内存分配失败处理
            printf("内存分配失败!\n");
            return;
        }
        scanf("%d", &p->data); // 输入数据
        p->next = NULL; // 新节点作为表尾,指针域置空
        rear->next = p; // 原尾节点链接新节点
        rear = p; // 尾指针更新
    }
}
  • 重点强调:
    • 尾指针rear的作用:避免每次找表尾遍历链表,提升效率;
    • p->next = NULL:保证最后一个节点指针域为NULL(表尾标志);
    • 内存分配失败处理:避免空指针访问;
    • 演示:输入"1 2 3",手绘节点指针变化(头节点→1→2→3,rear最终指向3)。

3. 核心知识点2:链表插入操作(6分钟)

(1)插入原则:先链后断(1分钟)
  • 强调:插入新节点时,必须先让新节点链接后续节点,再修改前驱节点的指针,否则会丢失后续链表。
(2)表头插入(2分钟)
  • 逻辑:插入到头节点之后、首元节点之前(头插法简化版)。
    代码+图解:

    c 复制代码
    // 表头插入元素e
    bool InsertHead(LinkList L, int e) {
        LNode *s = (LNode *)malloc(sizeof(LNode));
        if (s == NULL) return false; // 内存分配失败处理
        s->data = e;
        s->next = L->next; // 新节点链接原首元节点(先链)
        L->next = s; // 头节点链接新节点(后断)
        return true;
    }
  • 演示:链表已有"1 2 3",表头插入"0",结果为"0 1 2 3",手绘指针变化。

(3)表中插入(3分钟)
  • 需求:在第i个位置插入元素e(i≥1),核心是找到第i-1个前驱节点。
    代码+关键解析:

    c 复制代码
    // 表中第i个位置插入e
    bool ListInsert(LinkList L, int i, int e) {
        LNode *p = L;
        int j = 0;
        // 找第i-1个节点
        while (p != NULL && j < i-1) {
            p = p->next;
            j++;
        }
        if (p == NULL) return false; // i越界
        LNode *s = (LNode *)malloc(sizeof(LNode));
        if (s == NULL) return false; // 内存分配失败处理
        s->data = e;
        s->next = p->next; // 先链:新节点接后续
        p->next = s;       // 后断:前驱接新节点
        return true;
    }
  • 演示:链表"0 1 2 3",在第3个位置插入"9",结果为"0 1 9 2 3",重点手绘"p指向1,s->next指向2,p->next指向s"的过程。

4. 课堂小结(1分钟)

  • 三种插入方式对比:
    • 尾插法:保持输入顺序,时间复杂度O(1)(借助尾指针);
    • 表头插入:逆序存储,时间复杂度O(1);
    • 表中插入:任意位置插入,需先遍历找前驱节点,时间复杂度O(n)。
  • 关键点:
    • 理解指针操作"先连后断"的原则,避免链表断裂;
    • 掌握尾插法中尾指针的维护方法(初始指向头节点,新增节点后更新);
    • 注意内存分配失败的处理,防止程序崩溃。

5. 课后思考

  1. 如果不使用尾指针,尾插法的时间复杂度会变成多少?
  2. 如何实现单链表的逆置操作?
  3. 单链表与顺序表在插入操作上的效率差异体现在哪里?

三、板书设计(简洁版)

复制代码
单向链表核心操作
1. 节点定义:
struct LNode {int data; struct LNode *next;}

2. 尾插法建表:
- 尾指针rear初始→头节点
- 新节点→rear->next,rear→新节点
- 内存分配失败需处理

3. 插入操作:
→ 原则:先链后断
  表头插入:s->next=L->next → L->next=s(O(1),逆序)
  表中插入:找i-1前驱→s->next=p->next → p->next=s(O(n))
  尾插法:借助尾指针(O(1),顺序)

四、时间轴 & 教师活动/学生活动(精确到 30 s)

时间 教师活动 学生活动 设计意图
0:00-0:30 导入:举手机相册"批量导入保持顺序"问题,关联链表尾插需求 30 s 抢答:数组扩容代价 情境引入→引出尾插法需求
0:30-2:00 模型:手绘head→A→B→NULL的链表结构,展示尾指针作用 一人上台贴"尾指针"标签 具象化模型→抽象指针概念
2:00-4:00 算法:边画边写尾插法伪代码(初始化→新建节点→链接→更新尾指针) 跟读并口播"循环结束条件" 先梳理逻辑→再落地代码
4:00-6:00 代码:现场敲尾插法CreateList_Tail函数,强调内存分配失败处理 抄关键行,预测输入1/2/3的输出 还原真实IDE编程氛围
6:00-7:30 调试:故意漏写p->next=NULL,展示输出乱序→引导学生修正 观察输出异常→指出错误点 错误案例→强化核心细节
7:30-9:00 过渡:提问"如何把新结点放最前面?",引出表头插入 30 s 分组折纸演示插入过程 过渡衔接→引出表头插入
9:00-10:30 头插:白板动画演示"先链后断"两步操作,带读口诀"先连后,再断前" 齐读口诀,复述指针操作步骤 口诀记忆→防断链核心原则
10:30-12:00 中插:给出任务"在第i=3位置插入x=99",展示不完整代码让学生补全 2人一组补全3处关键空行 高阶思维→检验代码理解
12:00-15:00 小结+互动:讲解三种插入对比,抛出课后思考;评委提问时引导学生演示 回答对比问题,用纸质链表演示 检验深度→衔接课后思考
相关推荐
AI科技星2 小时前
质量定义方程常数k = 4π m_p的来源、推导与意义
服务器·数据结构·人工智能·科技·算法·机器学习·生活
Fine姐2 小时前
数据结构04——二叉树搜索树BST
数据结构
仰泳的熊猫2 小时前
1077 Kuchiguse
数据结构·c++·算法·pat考试
LYFlied3 小时前
【每日算法】LeetCode 19. 删除链表的倒数第 N 个结点
算法·leetcode·链表
阿里巴巴AI编程社区3 小时前
Qoder 提效实战:数据开发工程师用 Qoder 提效50%
数据结构
mit6.8243 小时前
[box64] 解决ARM64运行x86_64跨平台兼容性 | 机器架构配置
c语言
消失的旧时光-19433 小时前
从 C 链表到 Android Looper:MessageQueue 的底层原理一条线讲透
android·数据结构·链表
夏乌_Wx3 小时前
练题100天——DAY28:找消失的数字+分发饼干
数据结构·算法
lzh200409193 小时前
二叉搜索树与双向链表
数据结构·链表