本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。
一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。
如有侵权,请留言作删文处理。
课程视频链接:
数据结构与算法基础–第3周07–2.5线性表的链式表示和实现7–单链表基本操作5–取第i个元素值
📚 📌 📝 🔍 ⚠️ 😊 ⭐ 🔗 👋 ❓ 💬 🔹 🔸 🔖 ❗️ 💟 ➔
📚 【Week03】07_线性表的链式表示和实现7
【单链表的基本操作】取第 i 个元素值
【知识回顾】
带头结点的单链表
类型定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
变量定义
LinkList L;
LNode *p, *s;
重要操作
// p 指向头结点
p = L;
// s 指向首元结点
s = L->next;
// p 指向下一结点
p = p->next;
单链表的基本操作
(1) 单链表的销毁
(2) 清空单链表
(3) 求单链表的表长
(4) 判断单链表是否为空
(5) 取值:取单链表中第 i 个元素的内容
(6) 查找
按值查找:根据指定数据获取数据所在的位置(地址)
按值查找:根据指定数据获取数据所在的位置序号
(7) 插入:在第 i 个结点前插入新结点
(8) 删除:删除第 i 个结点
(9) 单链表的建立:头插法和尾插法
【算法】取值:取单链表中第 i 个元素的内容
❓ 顺序表中如何找到第 i 个元素 ?
顺序表中的元素是按照逻辑顺序存储,第 i 个元素就存储在下标第 i - 1 的位置上。
L->elem[i-1]
【算法思路】
(1) 取出表中第 3 个元素
从链表的头指针出发,顺着链域 next 逐个结点往下搜索,直至搜索到第 i 个结点为止。
因此,链表不是随机存取结构。
(2) 取出表中第 15 个元素
当输入的 i 的值超过了元素个数,指针 p 最后指向空指针,就没有必要往下找了。
(3) 当 i < 1,返回 False。
【算法步骤】
(1) 从第 1 个结点(L->next)顺链扫描,用指针 p 指向当前扫描到的结点,p 初值 为
p = L->next;
(2) j 做计数器,累计当前扫描过的结点数,j 初值为 1。
(3) 当 p 指向扫描到的下一个结点时,计数器 j 加 1。
(4) 当 j == i 时,p 所指的结点就是要找的第 i 个结点。
【算法描述】
// 获取线性表 L 中的某个数据元素的内容,通过变量 e 返回
Status GetElem_L(LinkList L, int i, ElemType &e){
// 初始化
p = L->next;
j = 1;
// 向后扫描,直到 p 指向第 i 个元素或 p 为空
while(p && j<i){
p = p->next;
++j;
}
if(!p || j>i){
// 第 i 个元素不存在
return ERROR;
}
e = p->data;
return OK;
}// GetElem_L