第一章 数据结构绪论
数据:描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
数据元素:组成数据的、有一定意义的基本单位,在计算机中通常作为正常退处理。(也称为记录)
数据项:一个数据元素可以由若干个数据项组成。*(就是对象属性)*是数据不可分隔的最小单位。
数据对象:是性质相同的数据元素的集合 , 是数据的⼦集。
数据结构:是 相 互 之 间 存 在 ⼀ 种 或 多 种 特 定 关 系 的 数 据 元 素 的 集 合 。
逻辑结构: 数 据 对 象 中 数 据 元 素 之 间 的 相 互 关 系 。
- 集 合 结 构:集 合 结 构 中 的 数 据 元 素 除 了 同 属 于 ⼀ 个 集 合 外,各 个 数 据 元 素 是 “ 平 等 ” 的 。
- 线 性 结 构:数 据 元 素 之 间 是 ⼀ 对 ⼀ 的 关 系
- 树 形 结 构:数 据 元 素 之 间 存 在 ⼀ 种 ⼀ 对 多 的 层 次 关 系
- 图 形 结 构:数 据 元 素 是 多 对 多 的 关 系
物 理 结 构 :是 指 数 据 的 逻 辑 结 构 在 计 算 机 中 的 存 储 形 式 。
- 顺 序 存 储 结 构:把 数 据 元 素 存 放 在 地 址 连 续 的 存 储 单 元 ⾥ , 系 和 物 理 关 系 是 ⼀ 致 的*(就 是 排 队 占 位)*
- 链 式 存 储 结 构:是 把 数 据 元 素 存 放 在 任 意 的 存 储 单 元 ⾥ , 这 组 存 储 单 元可以是连续 的 , 也 可 以 是 不 连 续 的 。(⽤⼀ 个 指 针 存 放 数 据 元 素 的 地 址)
数 据 类 型:是 指 ⼀ 组 性 质 相 同 的 值 的 集 合 及 定 义 在 此 集 合 上 的 ⼀ 些 操 作 的 总 称 。
例如在 C 语 ⾔ 中 , 按 照 取 值 的 不 同 , 数 据 类 型 可 以 分 为 两 类 :
- 原 ⼦ 类 型 : 是 不 可 以 再 分 解 的 基 本 类 型 , 包 括 整 型 、 实 型 、 字 符 型 等 。
- 结 构 类 型 : 由 若 ⼲ 个 类 型 组 合 ⽽ 成 , 型 数 据 组 成 的 ,是 可 以 再 分 解 的 。 例 如 , 整 型 数 组 是 由 若 ⼲ 整
抽 象 :指 抽 取 出 事 物 具 有 的 普 遍 性 的 本 质 。
**抽 象 数 据 类 型( A b s t r a c t D a t a T y p e , A D T ) **: 指 ⼀ 个 数 学 模 型 及 定 义 在 该 模 型上 的 ⼀ 组 操 作 。
第二章 算法
算法:解 决 特 定 问 题 求 解 步 骤 的 描 述 , 在 计 算 机 中 表 现 为 指 令 的 有 限 序 列 , 并 且 每 条 指 令 表 示 ⼀ 个 或 多 个 操 作 。
特性 解释 输 ⼊ 输 出 算 法 具 有 零 个 或 多 个 输 ⼊ ,⾄ 少 有 ⼀ 个 或 多 个 输出. 有 穷 性 算 法 在 执 ⾏ 有 限 的 步 骤 之 后 , ⾃ 动 结 束 ⽽ 不 会 出 现 ⽆ 限 循 环 , 并 且 每⼀ 个 步 骤 在 可 接 受 的 时 间 内 完 成 。 确 定 性 算 法 的 每 ⼀ 步 骤 都 具 有 确 定 的 含 义 , 不 会 出 现 ⼆ 义 性 。 可 ⾏ 性 算 法 的 每 ⼀ 步 都 必 须 是 可 ⾏ 的 , 也 就 是 说 , 每 ⼀ 步 都 能 够 通 过 执 ⾏ 有 限次 数 完 成 。 设计要求 解释 正 确 性 算 法 的 正 确 性 是 指 算 法 ⾄ 少 应 该 具 有 输 ⼊ , 输 出 和 加 ⼯ 处 理 ⽆ 歧 义 性 、能 正 确 反 映 问 题 的 需 求 、 能 够 得 到 问 题 的 正 确 答 案 。 可 读 性 设 计 的 另 ⼀ ⽬ 的 是 为 了 便 于 阅 读 、 理 解 和 交 流 。 健 壮 性 当 输 ⼊ 数 据 不 合 法 时 , 算 法 也 能 做 出 相 关 处 理 , ⽽ 不 是 产 ⽣ 异 常 或 莫 名其 妙 的 结 果 。 时 间 效 率 ⾼ 和 存 储 量 低 时 间 效 率 :指 的 是 算 法 的 执 ⾏ 时 间 , 对 于 同 ⼀ 个 问 题 , 如 果 有 多 个 算 法 能 够 解 决 ,执 ⾏ 时 间 短 的 算 法 效 率 ⾼ , 执 ⾏ 时 间 ⻓ 的 效 率 低 。
存 储 量 需 求: 指 的 是 算 法 在 执 ⾏ 过 程中 需 要 的 最 ⼤ 存 储 空 间 , 主 要 指 算 法 程 序 运 ⾏ 时 所 占 ⽤ 的 内 存 或 外 部 硬 盘 存 储 空 间 。
(⽤ 最 少 的 存 储 空 间 ,花 最 少 的 时 间 , 办 成 同 样 的 事)算 法 效 率 的 度 量 ⽅ 法
- 事 后 统 计 ⽅ 法 : 这 种 ⽅ 法 主 要 是 通 过 设 计 好 的 测 试 程 序 和 数 据 , 利 ⽤ 计 算 机 计 时 器 对 不 同 算 法 编 制 的 程 序 的 运 ⾏ 时 间 进 ⾏ ⽐ 较 , 从 ⽽ 确 定 算 法 效 率 的 ⾼ 低 。
- 事 前 分 析 估 算 ⽅ 法 : 在 计 算 机 程 序 编 制 前 , 依 据 统 计 ⽅ 法 对 算 法 进 ⾏ 估 算 。✅
⼀ 个 程 序 的 运 ⾏ 时 间 , 依 赖 于算 法 的 好 坏 和 问 题 的 输 ⼊ 规 模
- 问 题 输 ⼊ 规 模: 是 指 输 ⼊ 量 的 多 少 。
函 数 的 渐 近 增 ⻓ :给 定 两 个 函 数 f ( n ) 和 g ( n ) ,如 果 存 在 ⼀ 个 整 数 N , 使 得 对 于 所 有 的 n > N , f ( n ) 总 是 ⽐ g ( n ) ⼤ , 的 增 ⻓ 渐 近 快 于 g ( n )。
判 断 ⼀ 个 算 法 的效 率 时 , 函 数 中 的 常 数 和 其 他 次 要 项 常 常 可 以 忽 略 , ⽽ 更 应 该 关 注 主 项 ( 最 ⾼ 阶 项 )的 阶 数 。
时 间 复 杂 度 :记 作 : T ( n )= 0 ( f ( n ) )
它 表 示 随 问 题 规 模 n 的 增 ⼤ , 算 法 执 ⾏ 时 间 的 增 ⻓ 率 和f ( n ) 的 增 ⻓ 率 相 同 , 称 作 算 法 的 渐 近 时 间 复 杂 度 , 简 称 为 时 间 复 杂 度 。 其 中 f ( n ) 是 问 题 规 模 n 的 某 个 函 数 。
推 导 ⼤ O 阶 ⽅ 法:
1 . ⽤ 常 数 1 取 代 运 ⾏ 时 间 中 的 所 有 加 法 常 数 。 2 . 在 修 改 后 的 运 ⾏ 次 数 函 数 中 , 只 保 留 最 ⾼ 阶 项 。 3 . 如 果 最 ⾼ 阶 项 存 在 且 不 是 1 , 则 去 除 与 这 个 项 相 乘 的 常 数 。 得 到 的 结 果 就 是 ⼤ O 阶 。
分 析 算 法 的 复 杂 度 , 关 键 就 是 要 分 析 循 环 结 构 的 运 ⾏ 情 况 。
循 环 的 时 间 复 杂 度 等 于 循 环 体 的 复 杂 度 乘 以 该 循 环 运 ⾏ 的 次 数 。
算 法 空 间 复 杂 度:计 算 公 式 记 作 : S ( n ) = 0 ( E ( n ) ) , 其 中 , n 为 问 题 的 规 模 , f ( n ) 为 语 句 关 于n 所 占 存 储 空 间 的 函 数 。
第三章 线性表
线 性 表 ( L i s t ) : 零 个 或 多 个 数 据 元 素 的 有 限 序 列 。
若 将 线 性 表 记 为 ( a1 ,..., a i-1 , a i , a i+1 ,⋯, a n ) , 则 表 中 a i -1 领 先 于 a i , a i 领 先 于 a i +1 , 称 a i -1 是 ai 的 直 接 前 驱 元 素 , a i + 1 是 ai 的 直 接 后 继 元 素 。 当 i = 1 , 2 ,...,n-1时 , ai 有 且 仅 有 ⼀ 个 直 接 后 继 , 当 i = 2 , 3 , ... , n 时 , a i 有 且 仅 有 ⼀ 个 直 接 前驱 。
线 性 表 元 素 的 个 数 n ( n ≥ 0 ) 定 义 为 线 性 表 的 ⻓ 度 , 当 n = 0 时 , 称 为 空 表 。
在 较 复 杂 的 线 性 表 中 , ⼀ 个 数 据 元 素 可 以 由 若 ⼲ 个 数 据 项 组 成 。
线 性 表 的 抽 象 数 据 类 型
jsonA D T 线 性 表 ( L i s t ) Data 线 性 表 的 数 据 对 象 集 合 为 ( a 1 ,a2,...,a n } , 每 个 元 素 的 类 型 均 为 D a t a T y p e 。 其 中 , 除 第⼀ 个 元 素 a1 外 , 每 ⼀ 个 元 素 有 且 只 有 ⼀ 个 直 接 前 驱 元 素 , 除 了 最 后 ⼀ 个 元 来 a n 外 , 每 ⼀ 个 元 素 有 且 只 有 ⼀ 个 直 接 后 继 元 素 。 数 据 元 素 之 间 的 关 系 是 ⼀ 对 ⼀ 的 关 系 。 Operation Initlist (*L) : 初 始 化 操 作 , 建 ⽴ ⼀ 个 空 的 线 性 表 L 。 ListEmpty (L) : 若 线 性 表 为 空 , 返 回 t r u e , 否 则 返 回 f a l s e Clearlist (*L) : 线 性 表 清 空 。 GetElem ( L , i , * e ) : 将 线 性 表 L 中 的 第 i 个 位 置 元 素 值 返 回 给 e 。 LocateElem ( L , e ) : 在 线 性 表 L 中 查 找 与 给 定 值 e 相 等 的 元 素 , 如 果 查 找 成 功 , 返 回 该 元 素 在 表 中 序 号 表 示 成 功 ; 否 则 , 返 回 ⼝ 表 示 失 败 。 ListInsert ( * L , i , e ) : 在 线 性 表 ⼯ 中 的 第 i 个 位 置 插 ⼊ 新 元 素 e ListDelete ( * L , i , * e ) : 删 除 线 性 表 L 中 第 i 个 位 置 元 素 , 并 ⽤ e 返 回 其 值 。 ListLength (L) : 返 回 线 性 表 L 的 元 素 个 数 。 endADT线 性 表 的 顺 序 存 储 结 构: ⽤ ⼀ 段 地 址 连 续 的 存 储 单 元 依 次 存 储 线 性 表 的 数 据 元 素 。
顺 序 存 储 ⽅ 式:⼀ 维 数 组 来 实 现 顺 序 存 储 结 构 , 即 把 第 ⼀ 个 数 据 元 素 存 到 数 组 下 标 为 0 的 位 置 中 , 接 着 把 线 性 表 相 邻 的 元 素 存 储 在 数 组 中 相 邻 的 位 置 。
地 址:存 储 器 中 的 每 个 存 储 单 元 都 有 ⾃ ⼰ 的 编 号
地 址 计 算 ⽅ 法:
假 设 占 ⽤ 的 是 c 个 存 储 单 元 , 那 么 线 性 表 中 第 i + 1 个 数 据 元 素 的 存 储 位 置 和 第 i 个 数 据 元 素 的 存 储 位 置 满 ⾜ 下 列 关 系 ( L O C 表 示 获 得 存 储 位 置的 函 数 ) 。
LOC(a i +1) = LOC(a i) + c
对 于 第 i 个 数 据 元 素 a 的 存 储 位 置 可 以 由 a 1 推 算 得 出
LOC(a i) = LOC(a1) + (i-1)*c
线 性 表 顺 序 存 储 结 构 的 忧 缺 点
优点 缺点 1. ⽆ 须 为 表 示 表 中 元 素 之 间 的 逻 辑 关 系 ⽽ 增 加 额 外 的 存 储 空 间
2. 可 以 快 速 地 存 取 表 中 任 ⼀ 位 置 的 元 素1. 插 ⼊ 和 删 除 操 作 需 要 移 动 ⼤ 量 元 素
2. 当 线 性 表 ⻓ 度 变 化 较 ⼤时 , 难 以 确 定 存 储 空 间 的 容 量
3. 造 成 存 储 空 间 的 “ 碎 ⽚ ”线 性 表 的 链 式 存 储 结 构: 在 链 式 结 构 中 , 除 了 要 存 数 据 元 素 信 息 外 , 还 要 存 储 它 的后 继 元 素 的 存 储 地 址 。
为 了 表 示 每 个 数 据 元 素 a i 与 其 直 接 后 继 数 据 元 素 a i+ 1 之 间 的 逻 辑 关 系 , 对 数 据 元 素 a i 来 说 , 除 了 存 储 其 本 身 的 信 息 之 外 , 还 需 存 储 ⼀ 个 指 示 其 直 接 后 继 的 信 息 ( 即 直 接 后 继 的 存 储 位 置 )
数 据 域:存 储 数 据 元 素 信 息 的 域
指 针 域:存 储 直 接 后 继 位 置 的 域
指 针 (或 链):指 针 域 中 存 储 的 信 息
结 点 ( N o d e ):数据域+指针域
线 性 表 ( a 1 , a 2 ,⋯, a n ) 的 链式 存 储 结 构:n 个 结 点 ( a 1 的 存 储 映 像 ) 链 结 成 ⼀ 个 链 表
单 链 表:链 表 的 每 个 结 点 中 只 包 含 ⼀ 个 指 针 域 。
头指针: 链 表 中 第 ⼀ 个 结 点 的 存 储 位 置
头结点:在 单 链 表 的 第 ⼀ 个 结 点 前 附 设 ⼀ 个 结 点,头 结 点 的 数 据 域 可 以 不 存 储 任 何 信 息。
头 指 针 与 头 结 点 的 异 同
头指针 头结点 1. 头 指 针 是 指 链 表 指 向 第 ⼀ 个 结点 的 指 针 , 若 链 表 有 头 结 点 ,则 是 指 向 头 结 点 的 指 针
2. 头 指 针 具 有 标 识 作 ⽤ , 所 以 常 ⽤ 头 指 针 冠 以 链 表 的 名 字
3.⽆ 论 链 表 是 否 为 空 , 头 指 针 均不 为 空 。 头 指 针 是 链 表 的 必 要元 素1. 头 结 点 是 为 了 操 作 的 统 ⼀ 和 ⽅便 ⽽ 设 ⽴ 的 , 放 在 第 ⼀ 元 素 的结 点 之 前 , 其 数 据 域 ⼀ 般 ⽆ 意义 (也 可 存 放 链 表 的 ⻓ 度 )
2. 有 了 头 结 点 , 对 在 第 ⼀ 元 素 结
点 前 插 ⼊ 结 点 和 删 除 第 ⼀ 结 点 ,
其 操 作 与 其 它 结 点 的 操 作 就 统
3. 头 结 点 不 ⼀ 定 是 链 表 必 须 要 素节点的代码描述
c/* 线 性 表 的 单 链 表 存 储 结 构 */ typedef struct Node { ElemType data; struct Node *next; } Node; typedef struct Node *LinkList; /*定义 LinkList*/结 点 由 存 放 数 据 元 素 的 数 据 域 存 放 后 继 结 点地 址 的 指 针 域 组 成
单链表获 得 链 表 第 i 个 数 据 的 算 法 思 路
- 声 明 ⼀ 个 结 点 p 指 向 链 表 第 ⼀ 个 结 点 , 初 始 化 j 从 1 开 始 ;
- 当 j<i 时 , 就 遍 历 链 表 , 让 p 的 指 针 向 后 移 动 , 不 断 指 向 下 ⼀ 结 点 , j 累 加 1 ;
- 若 到 链 表 末 尾 p 为 空 , 则 说 明 第 i 个 元 素 不 存 在 ;
- 否 则 查 找 成 功 , 返 回 结 点 P 的 数 据 。
单 链 表 第 i 个 数 据 插 ⼊ 结 点 的 算 法 思 路 :
- 声 明 ⼀ 结 点 p 指 向 链 表 第 ⼀ 个 结 点 , 初 始 化 j 从 1 开 始 ;
- 当 j < i 时 , 就 遍 历 链 表 , 让 p 的 指 针 向 后 移 动 , 不 断 指 向 下 ⼀ 结 点 , j 累 加 1 ;
- 若 到 链 表 末 尾 P 为 空 , 则 说 明 第 i 个 元 素 不 存 在 ;
- 否 则 查 找 成 功 , 在 系 统 中 ⽣ 成 ⼀ 个 空 结 点 S ;
- 将 数 据 元 素 e 赋 值 给 s - > d a t a ;
- 单 链 表 的 插 ⼊ 标 准 语 句 s - > n e x t = p - > n e x t p - > n e x t = s ;
- 返 回 成 功 。
单 链 表 第 i 个 数 据 删 除 结 点 的 算 法 思 路 :
- 声 明 ⼀ 结 点 p 指 向 链 表 第 ⼀ 个 结 点 , 初 始 化 j 从 1 开 始 ;
- 当 j < i 时 , 就 遍 历 链 表 , 让 P 的 指 针 向 后 移 动 , 不 断 指 向 下 ⼀ 个 结 点 , j 累 加 1
- 若 到 链 表 末 尾 p 为 空 , 则 说 明 第 i 个 元 素 不 存 在 ;
- 否 则 查 找 成 功 , 将 欲 删 除 的 结 点 p - > n e x t 赋 值 给 9 ;
- 单 链 表 的 删 除 标 准 语 句 p - > n e x t = 9 > n e x t ;
- 将 q 结 点 中 的 数 据 赋 值 给 e , 作 为 返 回 ;
- 释 放 q 结 点 ;
- 返 回 成 功 。
单 链 表 整 表 创 建 的 算 法 思 路 :
- 声 明 ⼀ 结 点 P 和 计 数 器 变 量 i ;
- 初 始 化 ⼀ 空 链 表 L ;
- 让 L 的 头 结 点 的 指 针 指 向 N U L L , 即 建 ⽴ ⼀ 个 带 头 结 点 的 单 链 表 ;
- 循 环:
- ⽣ 成 ⼀ 新 结 点 赋 值 给 P ;
- 随 机 ⽣ 成 ⼀ 数 字 赋 值 给 P 的 数 据 域 p - > d a t a ;
- 将 p 插 ⼊ 到 头 结 点 与 前 ⼀ 新 结 点 之 间
头插法:始 终 让 新 结 点 在 第 ⼀ 的 位置。
尾插法:每 次 新 结 点 都 插 在 终 端 结 点 的 后 ⾯。
单 链 表 整 表 删 除 的 算 法 思 路
- 声 明 ⼀ 结 点 p 和 q ;
- 将 第 ⼀ 个 结 点 赋 值 给 p
- 循 环
- 将 下 ⼀ 结 点 赋 值 给 q ;
- 释 放 p
- 将 q 賦 值 给 p
使用场景选择
顺序结构 单链表结构 1、 需 要 频 繁 查 找 , 很 少 进 ⾏ 插 ⼊ 和 删 除 操 作 时
2、 事 先 知 道 线 性 表 的 ⼤ 致 ⻓ 度1、 需 要 频 繁 插 ⼊ 和 删 除 时
2、当 线 性 表 中 的 元 素 个 数 变 化 较 ⼤ 或 者 根 本 不 知 道 有 多 ⼤ 时静态链表:⽤ 数 组 描 述 的 链 表
备 ⽤ 链 表 :未 被 使 ⽤ 的 数 组 元 素 ,数 组 第 ⼀ 个 和 最 后 ⼀ 个 元 素 作 为 特 殊 元 素 处 理 , 不 存 数 据 。
静 态 链 表 的 插 ⼊ 操 作
- 先获取最后一个元素的cur值
- 将插入元素给列表中最后一个元素
- 找到被插入i位置的元素的cur
- 将新元素的cur改为被插入元素的cur(即第3步获取的cur)
- 将被插入元素的cur指定为新元素存储的下标
静 态 链 表 的 删 除 操 作 *