本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。
一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。
如有侵权,请留言作删文处理。
课程视频链接:
数据结构与算法基础–第3周09–2.5线性表的链式表示和实现9–单链表基本操作7–插入节点
📚 📌 📝 🔍 ⚠️ 😊 ⭐ 🔗 👋 ❓ 💬 🔹 🔸 🔖 ❗️ 💟 ➔
📚 【Week03】09_线性表的链式表示和实现9
单链表的基本操作
(1) 单链表的销毁
(2) 清空单链表
(3) 求单链表的表长
(4) 判断单链表是否为空
(5) 取值:取单链表中第 i 个元素的内容
(6) 查找
按值查找:根据指定数据获取数据所在的位置(地址)
按值查找:根据指定数据获取数据所在的位置序号
(7) 插入:在第 i 个结点前插入新结点
(8) 删除:删除第 i 个结点
(9) 单链表的建立:头插法和尾插法
【单链表的插入】在第 i 个结点前插入值为 e 的新结点
【算法步骤】
(1) 首先找到 a_i-1 的存储位置 p。
(2) 生成一个数据域为 e 的新结点 s。
(3) 插入新结点:
- 新结点的指针域指向结点 a_j
- 结点 a_i-1的指针域指向新结点
❓ 思考:步骤①和②能互换吗?先执行②,后执行①,可以吗?
💬 不可以!会丢失 a_i 的地址
【算法描述】
// 在线性表 L 中第 i 个数据元素之前插入数据元素 e
Status ListInsert_L(LinkList L, int i, ElemType &e){
// 初始化
p = L;
j = 0;
// 寻找第 i-1 个结点,p 指向 i-1 结点
while(p && (j<(i-1))){
p = p->next;
++j;
}
// i 大于表长 +1 或者小于 1,插入位置非法
if(!p || (j>(i-1))){
// 第 i 个元素不存在
return ERROR;
}
// 生成新结点 s,将结点 s 的数据域置为 e
s = new LNode;
s->data = e;
// 将结点 s 插入 L 中
s->next = p->next;
p->next = s;
return OK;
}// ListInsert_L