1、数据结构实验教程:C语言版王 玲 主编四川大学出版社责 任 编 辑 : 孙 康 江 责 任 校 对 : 刘 育 封 面 设 计 : 罗 光 责 任 印 制 : 李 平图 书 在 版 编 目 ( CIP ) 数 据数 据 结 构 实 验 教 程 : C 语 言 版 王 / 玲 主 编 .成 都 :四 川 大 学 出 版 社 , 2002 . 9ISBN 7 - 5614 - 2391 - 8 . 数 . . . . 王 . . . . 数 据结 构 - 高 等学 校 -教 材 C 语 言 - 程 序设 计 - 高 等学 校 - 教 材 .TP311 . 12中 国 版 本 图 书 馆 CIP 数
2、 据核字 (2002)第 074505 号书 名 数 据 结 构 实 验 教 程 ( C 语 言 版 )主 编 王 玲出 版 四 川 大 学 出 版 社地 址 成 都 市 一 环 路 南 一 段 24 号 (610065)印 刷 郫 县 犀 浦 印 刷 厂发 行 四 川 大 学 出 版 社开 本 787 mm1 092mm 1 1/6印 张 10 . 5字 数 227 千 字版 次 2002 年 10 月 第 1 版印 次 2002 年 10 月 第 1 次 印 刷印 数 0 001 2 000 册定 价 14 . 00 元版 权 所 有 侵 权 必 究 读者 邮购 本书 ,请 与本 社发 行
3、科 联系 。 电 话 :85408408 8/5401670/ 85408023 邮 政 编 码 :610065 本社 图书 如有印 装质 量问 题 ,请 寄 回 印 刷 厂 调 换 。 1 数 据 结 构 是 计 算 机 程 序 设 计 的 重 要 基 础 , 也 是 计 算 机 类 专 业 考 研 和 等 级 水 平 考 试 的必 考 科 目 , 而 且 正 逐 渐 发 展 成 为 众 多 理 工 科 专 业 的 热 门 选 修 课 。 严 蔚 敏 老 师 所 著 的 数 据 结 构 ( C 语 言 版 ) 是 一 本 优 秀 的 教 材 , 非 常 系 统 和 完 整 , 并 具 有 高
4、 度 的 数 据 抽 象 性 。 但 正 是 由 于 数 据 结 构 的 复 杂 性 和 抽 象 性 , 造 成 大 多 数 普 通 高 校 的 学 生 对 数 据 结 构 理 论 的 理 解不 够 深 刻 , 无 法 学 以 致 用 , 特 别 是 不 会 上 机 编 程 实 现 较 复 杂 的 数 据 结 构 程 序 。 本 书 正 是 为 了 解 决 这 些 问 题 而 编 写 的 实 验 性 配 套 教 材 。 书 中 将 数 据 结 构 众 多 知 识 点 归 纳 成 十 个 实 验 单 元 , 每 个 单 元 都 精 心 设 计 了 多 个 实 验 题 目 , 在 内 容 的 编
5、排 上 尽 量 选 取 经 典 实 例 , 力 求 新颖 、 有 趣 ; 每 个 实 验 题 目 采 取 了 统 一 的 格 式 , 并 对 每 个 具 体 的 实 验 题 目 给 出 了 完 整 的 问 题 描述 、 数 据 描 述 和 算 法 描 述 , 所 有 应 用 题 目 都 给 出 了 完 整 的 C 源 程 序 , 全 部 上 机 调 试 成 功 。 考 虑 到 读 者 应 该 能 在 模 仿 的 基 础 上 , 自 己 读 懂 算 法 后 编 程 实 现 类 似 的 功 能 , 因 此 每 个 题 目 结 束 后 , 我 们 都 给 出 了 一 些 实 验 题 , 希 望 读
6、者 能 够 在 改 进 现 有 程 序 的 基 础 上 , 完 善 新的 功 能 , 锻 炼 动 手 能 力 , 教 师 也 可 以 从 中 选 出 几 道 实 验 题 目 作 为 学 生 的 上 机 作 业 。 另 外 考 虑 到 数 据 结 构 是 计 算 机 专 业 和 相 关 专 业 考 研 的 必 考 科 目 , 为 了 加 强 “考 研” 读 者 的 思 维 训练 , 我 们 精 心 挑 选 了 近 几 年 有 一 定 难 度 的 部 分 考 研 题 作 为 思 考 题 。 这 些 考 研 题 与 各 章相 应 的 内 容 有 一 定 的 关 系 , 我 们 作 了 简 要 分 析
7、 后 , 留 给 读 者 作 进 一 步 的 思 考 和 完 善 。由 于 这 是 一 本 配 合 课 程 教 学 的 实 验 教 材 , 因 此 在 内 容 编 排 上 , 从 符 号 的 表 示 和 例 题 的 选 取 , 以 及 先 后 顺 序 的 安 排 , 都 与 教 材 数 据 结 构 ( C 语 言 版 ) ( 严 蔚 敏 等 编 著 , 清 华 大 学 出 版 社 ) 配 套 一 致 。 第 1 章 通 过 一 个 三 元 组 的 例 子 , 让 学 生 复 习 程 序 设 计 的 基 本 技 巧 , 学 会 从 算 法 描 述 到 C 程 序 的 转 换 ; 第 2 章 通
8、过 一 些 有 趣 的 实 例 , 让 学 生 巩 固 编 程 知 识 , 并 让 他们 体 会 数 据 结 构 化 的 优 势 ; 在 第 3 章 里 更 多 地 列 举 了 栈 和 队 列 的 应 用 例 子 ; 第 4 章 和 第 5 章中 , 结 合 C 语 言 的 数 组 和 串 类 型 讨 论 数 组 与 字 符 串 结 构 的 知 识 内 容 , 给 出 了 一 个 字 符串 基 本 运 算 的 综 合 实 例 , 以 使 理 论 与 实 际 应 用 和 谐 统 一 起 来 ; 第 6 章 和 第 7 章 的 树 和 图 是 两 个 最 难 理 解 的 数 据 结 构 , 也 是
9、 学 生 上 机 时 遇 到 困 难 最 多 的 部 分 , 因 此 分 配 了 较 多 的 学 时 来 分 析 和 实 现 书 上 的 基 本 算 法 , 希 望 学 生 能 通 过 上 机 , 掌 握 树 和 图 的 建 立 和 一 般 的 遍 历 方 法 , 提 高 编 程 能 力 ; 在 第 8 章 和 第 9 章 中 介 绍 了 数 据 结 构 最 有 用 的 排 序 和 查 找 算 法 , 以 及 一 些 程 序 设 计 技 巧 ; 第 10 章 的 内 容 对 学 生 是 一 个 提 高 , 结 合 所 学 的 数 据 结 构 知 识 , 讨 论 了 栈 与 递 归 问 题 和
10、图 的 搜 索 问 题 , 并 把 树 的 存 储 结 构 改 进 为 一 个 新 的 结 构 , 希 望 读 者 在 学 有 余 力 的 情 况 下 , 不 妨 开 动 脑 筋 , 分 析 一 些 复 杂 的 问 题 , 培 养 自 己 的 数 据 抽 象 能 力 。全 书 采 用 类 C 语 言 作 为 数 据 结 构 和 操 作 算 法 的 描 述 工 具 , 使 数 据 类 型 的 定 义 和 数 据结 构 相 关 操 作 算 法 的 描 述 更 加 简 明 清 晰 , 可 读 性 更 好 , 转 变 成 C 程 序 也 极 为 方 便 ; 考 虑 到 2 数 据 结 构 实 验 教
11、程 (C 语 言 版 )读 者 的 理 解 层 次 , 对 算 法 的 描 述 都 作 了 细 致 地 分 析 , 部 分 题 目 还 通 过 流 程 图 和 分 解 图 示 来 说 明 。 在 程 序 的 编 排 上 , 并 没 有 单 纯 追 求 程 序 的 简 练 , 更 多 的 是 利 用 书 上 给 出 的 模 块 , 增 加 程 序 的 易 读 性 , 有 助 于 加 深 对 教 材 知 识 的 理 解 。本 书 可 作 为 普 通 高 等 学 校 , 特 别 是 师 范 院 校 计 算 机 类 专 业 的 数 据 结 构 实 验 教 材 , 也 可 以 作 为 电 子 信 息 类
12、 相 关 专 业 的 选 修 实 验 教 材 , 建 议 上 机 学 时 为 24 32 学 时 , 打 * 号 的 章节 可 根 据 需 要 选 讲 。本 书 在 编 写 方 面 以 通 俗 易 懂 为 其 宗 旨 , 特 别 注 意 了 技 术 细 节 的 交 代 , 以 便 于 自 学 , 故 也 可 作 为 从 事 计 算 机 应 用 等 工 作 的 科 技 人 员 参 考 用 书 。 在 学 习 本 书 时 , 应 至 少 掌 握 一 门高 级 程 序 设 计 语 言 的 知 识 , 那 如 掌 握 的 是 C 语 言 则 最 为 理 想 ; 若 能 具 有 初 步 的 离 散 数
13、学和 概 率 论 的 知 识 , 对 书 中 某 些 内 容 的 理 解 会 更 容 易 。 学 习 本 书 的 同 时 还 需 把 严 蔚 敏 等 编著 的 数 据 结 构 ( C 语 言 版 ) 作 为 配 套 参 考 用 书 。参 加 本 书 编 写 工 作 的 教 师 和 编 写 的 章 节 是 : 第 1 章 和 第 8 章 由 四 川 师 大 的 刘 芳 老 师完 成 ; 第 2 章 和 第 3 章 分 别 由 绵 阳 师 院 的 吴 文 铁 老 师 和 段 金 蓉 老 师 完 成 ; 第 4 章 由 乐 山 师 院 的 孙 锐 老 师 完 成 ; 第 5 章 由 内 江 师 院
14、的 龙 文 光 老 师 完 成 ; 第 6 章 由 自 贡 师 专 的 梁 金 明 老 师 完 成 ; 第 7 章 和 第 9 章 分 别 由 四 川 师 院 的 蒲 在 毅 老 师 和 贺 春 林 老 师 完 成 ; 第 10 章 由 四川 师 大 的 王 玲 老 师 完 成 。 主 编 和 副 主 编 对 全 书 作 了 细 致 的 审 核 , 最 后 由 主 编 定 稿 。我 们 希 望 本 教 材 能 帮 助 读 者 系 统 地 完 成 上 机 实 验 , 同 时 更 好 地 理 解 数 据 结 构 的 知 识 , 为 今 后 设 计 复 杂 程 序 打 好 基 础 。 如 果 读 者
15、 能 够 从 中 获 得 一 些 有 益 的 帮 助 , 我 们 就 倍 感 欣慰 了 。 由 于 时 间 比 较 紧 , 加 之 作 者 水 平 有 限 , 书 中 难 免 有 不 妥 和 错 误 之 处 , 我 们 殷 切 期 待读 者 的 批 评 和 指 正 。编 者l wan g sicn u .ed u .cn 2002 年 7 月 于 四 川 成 都 1 第 1 章 实 现 抽 象 数 据 类 型 ( 1 )1 .1 知 识 准 备 ( 1 )1 .2 类 C 算 法 的 程 序 实 现 ( 3 )1 .3 抽 象 数 据 类 型 三 元 组 的 定 义 、 表 示 和 实 现 (
16、 5 )第 2 章 线 性 表 及 其 应 用 (10)2 .1 知 识 准 备 (10)2 .2 狐 狸 逮 兔 子 实 验 (12)2 .3 约 瑟 夫 问 题 (15)思 考 题 (20)第 3 章 栈 和 队 列 的 应 用 (21)3 .1 知 识 准 备 (21)3 .2 循 环 队 列 的 表 示 和 实 现 (23)3 .3 计 算 表 达 式 的 值 (27)3 .4 模 拟 服 务 台 前 的 排 队 现 象 问 题 (31)思 考 题 (34)第 4 章 字 符 串 的 应 用 * (36)4 .1 知 识 准 备 (36)4 .2 串 的 基 本 操 作 示 例 (38
17、)4 .3 字 符 串 操 作 演 示 系 统 (41)思 考 题 (51)第 5 章 矩 阵 的 压 缩 存 储 与 运 算 * (52)5 .1 知 识 准 备 (52)5 .2 用 三 元 组 表 实 现 稀 疏 矩 阵 的 基 本 操 作 (55)5 .3 十 字 链 表 表 示 稀 疏 矩 阵 的 基 本 操 作 (58)思 考 题 (62) 2 数 据 结 构 实 验 教程 第 6 章 树 和 二 叉 树 的 建 立 和 应 用 (64)6 .1 知 识 准 备 (64)6 .2 二 叉 树 的 基 本 运 算 实 验 (69)6 .3 线 索 二 叉 树 (75)6 .4 赫 夫
18、 曼 树 与 赫 夫 曼 编 码 (78)思 考 题 (82)第 7 章 图 的 建 立 和 应 用 (84)7 .1 知 识 准 备 (84)7 .2 图 的 遍 历 (87)7 .3 图 的 最 小 生 成 树 实 验 (91)7 .4 拓 扑 排 序 实 验 (96)思 考 题 (98)第 8 章 查 找 算 法 的 实 现 ( 100)8 .1 知 识 准 备 ( 100)8 .2 静 态 查 找 表 ( 103)8 .3 动 态 查 找 表 ( 107)8 .4 哈 希 表 设 计 ( 111)思 考 题 ( 116)第 9 章 内 部 排 序 算 法 的 实 现 ( 118)9 .
19、1 知 识 准 备 ( 118)9 .2 双 向 排 序 实 验 ( 125)9 .3 2 - 路 插 入 排 序 实 验 ( 127)9 .4 堆 排 序 实 验 ( 130)思 考 题 ( 136)第 10 章 综 合 实 验 * ( 137)10 .1 知 识 准 备 ( 137)10 .2 栈 与 递 归 ( 138)10 .3 图 的 搜 索 ( 144)10 .4 树 的 双 亲 - 子 女 环 存 储 结 构 ( 150)思 考 题 ( 155)第 1 章 实 现 抽 象 数 据 类 型 1 实 验 目 的1 . 复 习 高 级 程 序 设 计 语 言 的 使 用 方 法 , 将
20、 类 C 语 言 描 述 的 算 法 转 换 成 C 源 程 序 ,上 机 调 试 并 通 过 ; 学 会 分 析 基 本 算 法 的 时 间 复 杂 度 和 空 间 复 杂 度 。2 . 加 深 理 解 数 据 的 逻 辑 结 构 和 物 理 结 构 。3 . 了 解 抽 象 数 据 类 型 的 定 义 、 表 示 和 实 现 方 法 。 抽 象 数 据 类 型 需 要 借 助 固 有 的 数据 类 型 来 表 示 和 实 现 , 即 利 用 高 级 程 序 设 计 语 言 中 已 存 在 的 数 据 类 型 来 说 明 新 的 结 构 , 用 已 经 实 现 的 操 作 来 组 合 新 的
21、 操 作 , 具 体 实 现 的 细 节 则 依 赖 于 所 用 语 言 的 功 能 。4 . 熟 悉 类 C 语 言 的 书 写 规 范 , 特 别 要 注 意 值 调 用 和 引 用 调 用 的 区 别 , 以 及 如 何 转变 成 C 的 源 程 序 , 熟 悉 指 针 变 量 作 函 数 参 数 的 基 本 用 法 。1 . 1 知 识 准 备1 . 1 . 1 数 据 结 构 课 程 的 地 位数据 结 构 课 程 的 先 行 课 程 是 程 序 设 计 语 言 ( PASCAL、 C 或 C + + 语 言 ) 、 离 散 数 学 , 后 继 课 程 有 操 作 系 统 、 编 译
22、 原 理 、 数 据 库 方 法 、 算 法 设 计 与 分 析 、 人 工 智 能 等 。 数 据 结 构 和 算 法 是 程 序 设 计 的 两 大 支 柱 。 可 以 这 样 说 : 数 据 结 构 是 介 于 数 学 、 计 算 机 硬 件 和 计 算 机 软 件 之 间 的 一 门 核 心 课 程 。1 . 1 . 2 基 本 概 念 和 术 语1 . 数 据 : 是 对 客 观 事 物 的 符 号 表 示 , 在 计 算 机 科 学 中 是 指 所 有 能 输 入 到 计 算 机 中并 能 被 计 算 机 程 序 处 理 的 符 号 的 总 称 。2 . 数 据 元 素 : 它 是
23、 数 据 的 基 本 单 位 。3 . 数 据 对 象 : 它 是 性 质 相 同 的 数 据 元 素 的 集 合 , 是 数 据 的 一 个 子 集 。4 . 数 据 结 构 : 它 是 相 互 之 间 存 在 一 种 或 多 种 特 定 关 系 的 数 据 元 素 的 集 合 。 通 常 有四 种 基 本 的 数 据 结 构 , 它 们 是 集 合 、 线 性 结 构 、 树 型 结 构 、 图 型 ( 网 状 ) 结 构 。数 据 结 构 实 验 教 程 ( C 语 言 版 ) 2 2 3 n5 . 数 据 的 逻 辑 结 构 : 它 是 描 述 数 据 元 素 之 间 的 逻 辑 关
24、系 , 是 一 种 定 义 性 的 说 明 。6 . 物 理 ( 存 储 ) 结 构 : 它 是 数 据 结 构 的 机 内 表 示 , 可 以 分 为 顺 序 表 示 法 和 非 顺 序 表 示 法 。7 . 数 据 类 型 : 它 是 一 个 值 的 集 合 和 定 义 在 这 个 值 集 合 上 的 一 组 操 作 的 总 称 。8 . 抽 象 数 据 类 型 : 它 是 指 一 个 数 学 模 型 以 及 定 义 在 该 模 型 上 的 一 组 操 作 。 其 定 义仅 取 决 于 它 的 一 组 逻 辑 特 性 , 而 与 其 在 计 算 机 内 如 何 表 示 和 实 现 无 关
25、。1 . 1 . 3 抽 象 数 据 类 型 的 表 示 和 实 现抽 象 数 据 类 型 可 以 通 过 固 有 的 数 据 类 型 来 表 示 和 实 现 , 本 书 在 高 级 语 言 的 虚 拟 层 次 上 讨 论 抽 象 数 据 类 型 的 表 示 和 实 现 , 且 讨 论 的 数 据 结 构 和 算 法 主 要 是 面 向 用 户 的 , 故 采 用 类 C 语 言 作 为 描 述 工 具 。类 C 语 言 的 基 本 规 范 可 以 参 看 教 材 相 关 内 容 。这 里 需 要 说 明 的 是 函 数 参 数 的 类 型 。 为 了 便 于 算 法 描 述 , 除 C 语
26、言 提 供 的 传 值 方式 以 外 , 增 添 C + + 语 言 引 用 参 数 的 参 数 传 递 形 式 。 在 形 式 参 数 表 里 , 以 2 . 求 这 组 数 据 的 最 大 值 、 最 小 值 , 并 通 过 函 数 参 数 返 回 。【 数 据 描 述 】# define MAXNU M 20 /定 / 义 数 据 的 最 大 数 目 typedef in t Elem T ype; /定 / 义 数 据 元 素 的 类 型 , 此 处 设 为 int , 用 户 也 可 自 行 定 义 Elem T ype a MAXN UM + 1 ; /定 / 义 一 个 一 维
27、数 组 存 放 数 据 元 素 值 /为 / 了 使 用 习 惯 , 数 组 的 下 标 从 1 开 始【 算 法 描 述 】void Create ( Ele mT ype x , in t /算 法 描 述 可 以 省 略 格 式 串 , 以 及 局 部 变 量 的 说 明for ( i = 1 ; i max) max = x i ;if ( x i * max) * max = x i ;if ( x i , 基 本 操 作 :Init T riplet ( /定 / 义 数 据 元 素 类 型 Elem T ype , 此 处 为 in t , /用 / 户 可 根 据 具 体 情
28、况 自 己 定 义typedef Elem T ype * T riplet /采 / 用 动 态 分 配 的 顺 序 存 储 结 构【 算 法 描 述 】Status Init T riple ( T riplet if ( ! T ) exit OVER FLOW ; /存 / 储 分 配 失 败scanf ( T 0 = v1 ; T 1 = v2 ; T 2 = v3 ; /I/nitT ripletStatus Destroy T riplet ( T riplet T = N UL L ; /D/est roy T ripletStatus Get ( Triplet T , in
29、t i , Elem T ype e = T i - 1 ;return OK ; /G/ete 返 回 T 的 第 i 个 元 的 值Status Put ( T riplet T i - 1 = e;return OK ; /P/u te 修 改 第 i 个 元 的 值Status IsAscending ( T riplet T ) /判 / 断 三 元 组 元 素 是 否 递 增return ( T 0 T 1 ) /I/sDescendingStatus Max ( T riplet T , Elem T ype return OK ; /M/ axStatus Min ( T ri
30、plet T , Elem T ype */ 定 义 数 据 元 素 类 型 */ typedef Elem T ype * T riplet ; */ 采 用 动 态 分 配 的 顺 序 存 储 结 构 表 示 三 元 组 */typedef in t Stat us ;# define OK 1# define ERR OR 0# define OV ERF LOW - 2Status Init T riplet ( T riplet * T ) */ 构 造 三 元 组 T */ Elem T ype v1 , v2 , v3 ;* T = ( Elem Type * ) malloc
31、( 3 * sizeof ( Elem T ype) ) ;if ( * T = = 0) return OV ERF LOW ; */ 存 储 分 配 失 败 */ scanf ( % d % d % d , ( * T ) 0 = v1 ; ( * T ) 1 = v2 ; ( * T ) 2 = v3 ;Status Destroy T riplet ( T riplet * T ) */ 销 毁 三 元 组 T */ free ( * T ) ; * T = NU LL ;Status Get ( Triplet T , int i , Elem T ype * e) */ 用 e 返
32、 回 T 的 第 i 个 元 的 值 */ if ( i 3 ) return ER ROR ;* e = T i - 1 ; return OK ;Status Put ( T riplet * T , int i , Elem T ype e ) */ 修 改 三 元 组 第 i 个 元 的 值 为 e */ if ( i 3 ) return ER ROR ;( * T ) i - 1 = e;return OK ;Status IsAscending ( T riplet T ) */ 判 断 三 元 组 元 素 是 否 递 增 */ return ( T 0 T 1 ) 数 据 结
33、构 实 验 教 程 ( C 语 言 版 ) 8 Status Max ( T riplet T , Elem T ype * e) */ 取 三 元 组 的 最 大 元 */* e = ( T 0 = T 1 ) ?( ( T 0 = T 2 ) ? T 0 : T 2 ) : ( ( T 1 = T 2 ) ? T 1 : T 2 ) ;return OK ;Status Min ( T riplet T , Elem T ype * e) */ 取 三 元 组 的 最 小 元 */* e = ( T 0 # include # define OK 1# define OV ERF LOW
34、- 2 typedef in t status ;typedef in t Elem T ype;# define L IS T- IN I T-SIZE 10 */ 线 性 表 存 储 空 间 的 初 始 分 配 量 */ typedef s truct Elem Type * elem ; */ 存 储 空 间 基 址 * /int leng th ; */ 当 前 长 度 * /int listsize; */ 当 前 分 配 的 存 储 容 量 ( 以 sizeof ( Elem T ype ) 为 单 位 ) */ Sq List ;s tat us InitList-Sq ( Sq
35、 List * L ) */ 构 造 一 个 线 性 表 L */( * L ) . elem = ( Elem Type * ) malloc ( L IST- I NI T -SIZ E * sizeof ( Elem T ype ) ) ;if ( ! ( ( * L ) . elem ) ) ret urn OVER FLOW ; */ 存 储 分 配 失 败 * /( * L ) . length = 0 ; */ 空 表 长 度 为 0 */( * L ) . listsize = LIS T- IN I T-SIZE ; */ 初 始 存 储 容 量 */ return OK ;
36、 */ Init List-Sq */s tat us Rabbit ( SqList * L ) */ 构 造 狐 狸 逮 兔 子 函 数 */in t i , cur rent = 0 ; */ 定 义 一 个 当 前 洞 口 号 的 记 数 器 , 初 始 位 置 为 第 一 个 洞 口 */ for ( i = 0 ; i = 1 ; i - - ) if ( ! ( p = ( CNode * ) malloc ( sizeof ( CNode ) ) ) )return OVER FLOW ; /存 / 储 分 配 失 败p - data = i;p - nex t = clist
37、 ; clis t = p ;if ( i = = n)q = p ; /用 /q 指 向 链 表 的 最 后 一 个 结 点q - next = clist ; /把 / 链 表 的 最 后 一 个 结 点 的 链 域 指 向 链 表 的 第 一 个 结 点 , 构 成 循 环 链 表return OK; /e/nds tat us Joseph ( int m, in t n , int k) if ( m n) return ERR OR ; /起 / 始 位 置 错 17 第 2 章 线 性 表 及 其 应 用if ( ! Create_clist ( clist , n ) )ret
38、urn ERR OR ; /循 / 环 链 表 创 建 失 败p = clist ;for ( i = 1 ; i next ; /p/指 向 m 位 置 的 结 点w hile ( p) for ( i = 1 ; i nex t; /找 / 出 第 k 个 结 点q = p - nex t ;prin tf ( % d , q - data ) ; /输 / 出 应 出 列 的 结 点if ( p - next = = p) p = null; /删 / 除 最 后 一 个 结 点else p - next = q - next ; /删 / 除 第 k 个 结 点p = p - nex
39、t; /使 /f ree (q) ; /w/hile clis t = NU LL ; /e/nd【 C 源 程 序 】# include # include # define NU LL 0# define OK 1# define ERR OR 0# define OV ERF LOW - 2 typedef in t Stat us ;p 指 向 第 k + 1 个 元 素 位 置typedef in t Elemtype; */ 定 义 数 据 元 素 类 型 */typedef s truct Cnode Elemtype data;st ruct Cnode * next ; C
40、Node;C Node * joseph ; */ 定 义 一 个 全 局 变 量 */ Status Create-clist ( CNode * clist , int n) CNode * p , * q ; in t i;clis t = NU LL ;for ( i = n ; i = 1 ; i - - ) p = ( CNode * ) malloc ( sizeof ( CNode ) ) ;if ( p = = N U LL ) ret urn OVER FLOW ; */ 存 储 分 配 失 败 */ p - data = i; 18 数 据 结 构 实 验 教 程 ( C
41、 语 言 版 )p - nex t = clist ; clis t = p ;if ( i = = n)q = p ; */ 用 q 指 向 链 表 的 最 后 一 个 结 点 */q - next = clist ; */ 把 链 表 的 最 后 一 个 结 点 的 链 域 指 向 链 表 的 第 一 个 结 点 , 构 成 循 环 链 表 */ joseph = clis t; */ 把创建好的循 环链表头指针 赋给全局变量 */ return OK; */ end */Status Joseph ( CNode * clis t , int m , int n , int k) int
42、 i;C Node * p, * q ;if ( m n) return ERR OR ; */ 起 始 位 置 错 */ if ( ! Create-clist ( clist , n ) )return ERR OR ; */ 循 环 链 表 创 建 失 败 */p = joseph ; */ p 指 向 创 建 好 的 循 环 链 表 */ for ( i = 1 ; i next ; */ p 指 向 m 位 置 的 结 点 */w hile ( p) for ( i = 1 ; i next ; */q = p - nex t ;找 出 第 k 个 结 点 * /prin tf (
43、% d , q - data ) ; */ 输 出 应 出 列 的 结 点 */ if ( p - next = = p)p = NU LL ; */ 删 除 最 后 一 个 结 点 */else p - next = q - next ; p = p - nex t;f ree (q) ; */ while */ clis t = NU LL ; */ end * /void main ( ) int m , n, k , i; C Node * clist ;clis t = NU LL ; */ 初 始 化 clist */prin tf ( n 请 输 入 围 坐 在 圆 桌 周 围
44、的 人 数 n : ) ; scanf ( % d , 19 第 2 章 线 性 表 及 其 应 用prin tf ( n 请 输 入 第 一 次 开 始 报 数 人 的 位 置 m : ) ; scanf ( % d , prin tf ( n 你 希 望 报 数 到 第 几 个 数 的 人 出 列 ? ) ; scanf ( % d , Create-clis t ( clist , n) ; */ 创 建 一 个 有 n 个 结 点 的 循 环 链 表 clist */ prin tf ( n 出 列 的 顺 序 如 下 : n ) ;Joseph ( clis t , m , n ,
45、k) ; getch ( ) ; */ m ain */【 测 试 数 据 】1 . 请 输 入 围 坐 在 圆 桌 周 围 的 人 数 n : 7 请 输 入 第 一 次 开 始 报 数 人 的 位 置 m : 3 你 希 望 报 数 到 第 几 个 数 的 人 出 列 ? 2 出 列 的 顺 序 如 下 : 4 6 1 3 7 5 22 . 请 输 入 围 坐 在 圆 桌 周 围 的 人 数 n : 13 请 输 入 第 一 次 开 始 报 数 人 的 位 置 m : 5 你 希 望 报 数 到 第 几 个 数 的 人 出 列 ? 6 出 列 的 顺 序 如 下 : 10 3 9 4 12
46、 7 5 2 6 11 8 1 133 . 请 输 入 围 坐 在 圆 桌 周 围 的 人 数 n : 21 请 输 入 第 一 次 开 始 报 数 人 的 位 置 m : 3 你 希 望 报 数 到 第 几 个 数 的 人 出 列 ? 9出 列 的 顺 序 如 下 : 11 20 8 18 7 19 10 2 15 9 4 1 21 3 6 14 12 13 5 16 17【 说 明 】本 算 法 采 用 一 个 不 带 表 头 的 循 环 链 表 来 处 理 约 瑟 夫 问 题 。 在 此 算 法 中 , 每 次 找 出 需 出 列 结 点 , 要 经 过 k 次 循 环 移 动 定 位
47、指 针 , 全 部 结 点 出 列 , 需 经 过 n 个 k 次 循 环 , 因 此 , 本 算 法 的 时 间 复 杂 度 为 O ( k * n) 。 实 际 问 题 的 处 理 中 , 有 许 多 与 约 瑟 夫 问 题 类 似 , 都 可 以 采 用 此 方 法 完 成 。【 实 验 题 】1 . 处 理 约 瑟 夫 问 题 也 可 用 数 组 完 成 , 请 读 者 自 己 编 写 使 用 数 组 实 现 约 瑟 夫 问 题 的算 法 和 程 序 。2 . 猴 王 问 题 。 某 森 林 中 有 n 只 猴 子 在 商 量 猴 王 选 举 问 题 , 所 有 的 猴 子 都 想 当
48、 猴 王 , 因 此 大 家 商 量 了 一 个 选 举 办 法 如 下 : 所 有 的 猴 子 围 成 一 圈 , 先 从 第 一 个 猴 子 开 始 报 数 , 报 数 到 13 的 猴 子 就 出 列 。 紧 接 着 的 下 一 个 猴 子 , 又 从 1 开 始 进 行 新 的 一 轮 报 数 , 报 数 到 12 的 猴 子 再 出 列 ; 依 此 重 复 下 去 , 每 一 轮 报 数 都 比 上 一 轮 的 报 数 少 1 , 直 到 报 数 减到 1 之 后 , 又 从 13 开 始 报 数 。 这 些 重 复 循 环 过 程 一 直 进 行 到 原 列 中 只 剩 下 最 后 一 个 猴子 为 止 , 这 个 猴 子 就 是 猴 王 。 试 设 计 一