1、实验一:线性表的存储结构定义及基本操作(必做:基本 2学时 , 扩展 4学时)一、实验目的:一、实验目的:一、实验目的:一、实验目的:.掌 握线 性表 的逻 辑特 征.掌 握线 性表 顺序 存储 结构 的特 点, 熟练 掌握 顺 序 表 的基 本运 算.熟 练掌 握线 性表 的 链 式存 储结 构定 义及 基本 操作.理 解循 环链 表和 双链 表的 特点 和基 本运 算.加 深对 顺序 存储 数据 结构 的理 解和 链式 存储 数据 结构 的理 解 , 逐 步培 养解 决实 际问 题的 编程 能力二、实验内容:二、实验内容:二、实验内容:二、实验内容:( 一) 基本 实验 内容 (顺 序表
2、) :建 立顺 序表 , 完 成顺 序表 的基 本操 作 : 初 始化 、 插 入 、 删 除 、 逆 转 、 输 出 、 销 毁 ,置 空表 、求 表长 、查 找元 素、 判线 性表 是否 为空 ;1 问题 描述 : 利 用顺 序表 ,设 计一 组输 入数 据( 假定 为一 组整 数 ) , 能 够 对 顺序 表进 行如 下操 作: .创 建一 个新 的顺 序表 ,实 现动 态空 间分 配的 初始 化;.根 据顺 序表 结点 的位 置插 入一 个新 结点 (位 置插 入 ), 也 可以 根据 给定 的值 进行 插入 (值 插入 ), 形成 有序 顺序 表;.根 据顺 序表 结点 的位 置 删
3、 除 一 个结 点 (位 置删 除 ), 也 可以 根据 给定 的值 删除 对应 的第 一个结 点, 或者 删除 指定 值的 所有 结点 (值 删除 );.利 用最 少的 空间 实现 顺序 表元 素的 逆转 ;.实 现顺 序表 的各 个元 素的 输出 ;.彻 底销 毁顺 序线 性表 ,回 收所 分配 的空 间;.对 顺序 线性 表的 所有 元素 删除 ,置 为空 表;.返 回其 数据 元素 个数 ;.按 序号 查找 , 根据 顺序 表的 特点 ,可 以随 机存 取, 直接 可以 定位 于 第 i个 结点 , 查找 该元 素的 值, 对查 找结 果进 行返 回; .按 值查 找 , 根 据给 定
4、数 据元 素的 值 , 只 能顺 序比 较 , 查 找该 元素 的位 置 , 对 查找 结果 进行返 回;.判 断顺 序表 中是 否有 元素 存在 ,对 判断 结果 进行 返回 ;.编 写主 程序 ,实 现对 各不 同的 算法 调用 。2 实现 要求 : 对 顺序 表的 各项 操作 一定 要编 写成 为 C( +) 语 言函 数 , 组 合成 模块 化的 形式 , 每 个算 法的 实现 要从 时间 复杂 度和 空间 复杂 度上 进行 评价 ; .“ 初 始化 算法 ” 的 操作 结果 : 构 造一 个空 的顺 序线 性表 。 对 顺序 表的 空间 进行 动态 管理 ,实 现动 态分 配、 回收
5、 和增 加存 储空 间; .“ 位 置插 入算 法 ” 的 初始 条件 :顺 序线 性表 L已 存在 ,给 定的 元素 位置 为 i, 且 1 iListength(L)+1; 操 作结 果 : 在 L中 第 i个 位置 之前 插入 新的 数据 元素 e, L的 长度 加 1;.“ 位 置删 除算 法 ” 的 初始 条件 :顺 序线 性表 L已 存在 , 1 i Listength(L);操 作结 果 : 删 除 L的 第 i个 数据 元素 , 并 用 e返 回其 值 , L的 长度 减 1;.“ 逆 转算 法 ” 的 初始 条件 :顺 序线 性表 L已 存在 ;操 作结 果 : 依 次对 L
6、的 每个 数据 元素 进行 交换 , 为 了使 用最 少的 额外空 间, 对顺 序表 的元 素进 行交 换; .“ 输 出算 法 ” 的 初始 条件 :顺 序线 性表 L已 存在 ;操 作结 果: 依次 对 L的 每个 数据 元素 进行 输出 ;.“ 销 毁算 法 ” 初 始条 件: 顺序 线性 表 L已 存在 ;操 作结 果: 销毁 顺序 线性 表 L;.“ 置 空表 算法 ” 初 始条 件: 顺序 线性 表 L已 存在 ;操 作结 果: 将 L重 置为 空表 ;.“ 求 表长 算法 ” 初 始条 件: 顺序 线性 表 L已 存在 ;操 作结 果: 返回 L中 数据 元素 个数 ;.“ 按
7、序号 查找 算法 ” 初 始条 件 : 顺 序线 性 表 L已 存在 , 元 素位 置 为 i, 且 1 i ListLength(L)操 作结 果: 返回 L中 第 i个 数据 元素 的值.“ 按 值查 找算 法 ” 初 始条 件: 顺序 线性 表 L已 存在 ,元 素值 为 e;操 作结 果: 返回 L中 数据 元素 值为 e的 元素 位置 ;.“ 判 表空 算法 ” 初 始条 件: 顺序 线性 表 L已 存在 ;操 作结 果: 若 L为 空表 ,则 返回 TRUE, 否则 返回 FALSE;分 析 :修 改输 入数 据, 预期 输出 并验 证输 出的 结果 ,加 深对 有关 算法 的理
8、解。(二 )基 本实 验内 容( 链表 ) :建 立单 链表 ,完 成链 表( 带表 头结 点) 的基 本操 作: 建立 链表 、插 入、 删除 、查 找 、 输出 、求 前驱 、求 后继 、两 个有 序链 表的 合并 操作 。其 他基 本操 作还 有销 毁链 表 、 将 链表 置为 空表 、 求 链表 的长 度 、 获 取某 位置 结点 的内 容 、搜 索结 点 。1 问 题描 述: 利 用 线 性表 的链 式存 储结 构 ,设 计一 组输 入数 据 ( 假 定为 一组 整数 ) , 能 够 对 单链 表进 行如 下操 作: .初 始化 一个 带表 头结 点的 空链 表;.创 建一 个单 链
9、表 是从 无到 有地 建立 起一 个链 表, 即一 个一 个地 输入 各结 点数 据, 并建 立起 前后 相互 链接 的关 系。 又分 为逆 位序 (插 在表 头 )输 入 n个 元素 的值 和正 位序 (插 在表 尾 )输入 n个 元素 的值 ;.插 入结 点可 以根 据给 定位 置进 行插 入( 位置 插入 ) , 也可 以根 据结 点的 值插 入到 已知 的链表 中( 值插 入 ) , 且保 持结 点的 数据 按原 来的 递增 次序 排列 ,形 成有 序链 表。.删 除结 点可 以根 据给 定位 置进 行删 除( 位置 删除 ) , 也可 以把 链表 中查 找结 点的 值为 搜索对 象的
10、 结点 全部 删除 (值 删除 ) ;.输 出单 链表 的内 容是 将链 表中 各结 点的 数据 依次 显示 ,直 到链 表尾 结点 ;.编 写主 程序 ,实 现对 各不 同的 算法 调用 。其 它的 操作 算法 描述 略。2 实现 要求 : 对 链表 的各 项操 作一 定要 编写 成为 C( +) 语 言函 数 , 组 合成 模块 化的 形式 , 还 要针对 每个 算法 的实 现从 时间 复杂 度和 空间 复杂 度上 进行 评价 。 .“ 初 始化 算法 ” 的 操作 结果 :构 造一 个空 的线 性表 L, 产生 头结 点 ,并 使 L指 向此 头结 点 ;.“建 立链 表算 法 ” 初
11、始条 件: 空链 存在 ;操 作结 果 : 选 择逆 位序 或正 位序 的方 法 , 建 立一 个单 链表 , 并 且返 回完成 的结 果; .“ 链 表( 位置 )插 入算 法 ” 初 始条 件: 已知 单链 表 L存 在;操 作结 果: 在带 头结 点的 单链 线性 表 L中 第 i个 位置 之前 插入 元素 e;.“ 链 表( 位置 )删 除算 法 ” 初 始条 件: 已知 单链 表 L存 在;操 作结 果: 在带 头结 点的 单链 线性 表 L中 ,删 除第 i个 元素 ,并 由 e返回 其值 ; .“ 输 出算 法 ” 初 始条 件: 链表 L已 存在 ;操 作结 果: 依次 输出
12、链表 的各 个结 点的 值;( 三) 扩展 实验 内容 (顺 序表 ) 查 前驱 元素 、查 后继 元素 、顺 序表 合并 等 .1 问题 描述 :.根 据给 定元 素的 值, 求出 前驱 元素 ;.根 据给 定元 素的 值, 求出 后继 元素 ;.对 已建 好的 两个 顺序 表进 行合 并操 作 , 若 原线 性表 中元 素非 递减 有序 排列 ,要 求合 并后 的结 果 还 是 有 序 (有 序 合 并 ) ; 对 于 原 顺 序 表 中 元 素 无 序 排 列 的 合 并 只 是 完 成 A= B( 无 序 合并 ), 要求 同样 的数 据元 素只 出现 一次 。 .修 改 主 程序 ,
13、实 现对 各不 同的 算法 调用 。2 实现 要求 :.“ 查 前驱 元素 算法 ” 初 始条 件: 顺序 线性 表 L已 存在 ;操 作结 果: 若数 据元 素存 在且 不是 第一 个, 则返 回前 驱, 否则 操作 失败 ;.“ 查 后继 元素 算法 ” 初 始条 件: 顺序 线性 表 L已 存在 ;操 作结 果 : 若 数据 元素 存在 且不 是最 后一 个 , 则 返回 后继 , 否 则操 作失 败 ;.“ 无 序合 并算 法 ” 的 初始 条件 :已 知线 性表 La和 Lb;操 作结 果: 将所 有在 线性 表 Lb中 但不 在 La中 的数 据元 素插 入到 La中 ;.“ 有
14、序合 并算 法 ” 的 初始 条件 : 已 知线 性表 La和 Lb中 的数 据元 素按 值非 递减 排列 ;操 作结 果 : 归 并 La和 Lb得 到新 的线 性表 Lc,Lc的 数据 元素 也按 值非 递减排 列;( 四) 扩展 实验 内容 (链 表) 1 问题 描述 :.求 前驱 结点 是根 据给 定结 点的 值 , 在 单链 表中 搜索 其当 前结 点的 后继 结点 值为 给定 的值 ,将 当前 结点 返回 ; .求 后继 结点 是根 据给 定结 点的 值 , 在 单链 表中 搜索 其当 前结 点的 值为 给定 的值 , 将 后继 结点 返回 ;.两 个有 序链 表的 合并 是分 别
15、将 两个 单链 表的 结点 依次 插入 到第 3个 单链 表中 , 继 续保 持结点 有序 ; 2 实现 要求 :.“ 求 前驱 算法 ” 初 始条 件 :线 性表 L已 存在 ;操 作结 果 :若 cur_e是 L的 数据 元素 ,且 不是 第一 个 ,则 用 pre_返 回它 的前 驱; .“ 求 后继 算法 ” 初 始条 件 :线 性表 L已 存在 ;操 作结 果 :若 cur_e是 L的 数据 元素 ,且 不是 最后 一个 ,则 用 next_e返 回它的 后继 ; .“ 两 个有 序链 表的 合并 算法 ” 初 始条 件 :线 性表 单 链线 性表 La和 Lb的 元素 按值 非递
16、减排列 ;操 作结 果 :归 并 La和 Lb得 到新 的单 链表 。三、实验指导三、实验指导三、实验指导三、实验指导一 个简 单程 序通 常主 要由 三部 分构 成: 1、 常 量定 义 ( #define) , 类 型重 定义 (typedf)及 函数 原型 (#include)声 明 ; 还 有针 对每 一种 数据 结构 的类 型定 义 , 由 于本 实验 是要 求实 现对 线性 表的 顺序 存储 和链 式存 储两 种存储 结构 的定 义, 因此 不同 的物 理存 储结 构的 定义 和其 基本 操作 最好 是以 独立 的文 件存 在 , 因此 本实 验将 顺序 表和 链表 可分 解为 两
17、个 不同 的实 验部 分。 2、 算 法 函 数 , 对 于 顺 序 表 , 每 一 个 函 数 具 有 独 立 的 功 能 , 组 合 成 为 模 块 的 形 式 , 如ListInit_Sq、 ListInsert_Sq、 ListDelte_Sq、 ListRevrse_Sq、 ListPrint_Sq等 ;对 于 链 表 , 每 一 个 函 数 具 有 独 立 的 功 能 , 组 合 成 为 模 块 的 形 式 , 如 ListInit_Link、ListInsert_Link、 ListDelte_Link、 ListTraverse_Link、 PriorElem_Link、Nex
18、tElem_Link、 GetElem_Link、 MergeList_Link等 ;3、 主函 数( m ain) 。【 说 明 1】 顺 序表 的定 义与 操作1 可 以将 这三 部分 组合 在一 个文 件中 , 也 可 以 按 照 项 目 的 方 式 ( 多 个 不 同 的 文 件 组 合在 一 起 , 共 同 完 成 一 个 功 能 ) 进 行 组 织 ( 本 课 程 的 实 验 强 烈 推 荐 这 种 形 式 ) , 如 将本 课程 后续 所 有 算 法 几 乎 都 要 使 用 的 常 量 定 义 ( #define) 和 系 统 函 数 原 型 定 义 (#include)声 明
19、组 合 成一 个文 件 , 存 储为 一个 头文 件 ( 取 名 为 pubse.h) , 只 需建 立一 次 , 以 后凡 涉及 到相 关的 内容 ,只 需在 你的 文件 的前 面加 上一 条 #include“pubse.h”即 可, 无需 重复 输入 。2 对 于类 型定 义 , 由 于每 一种 数据 结构 的定 义都 不一 样 , 因 此要 进行 专门 的类 型定 义 ,也 可以 将数 据结 构的 定义 组合 成为 一个 文件 , 存 储为 一个 头文 件 ( 如 线性 表的 顺序 存储 结构定 义取 名为 seqlistDef.h) , 只 需建 立一 次 , 以 后凡 涉及 到关
20、于顺 序表 操作 的相 关内 容 , 一 定要 在 你 的 文 件 的 前 面 加 上 一 条 #include“seqlistDef.h”即 可 , 无 需 重 复 进 行 顺 序 存 储 结 构 的定 义。 3 关于 实验 内容 要完 成的 操作 ,一 般都 以独 立的 算法 出现 ,关 于某 类数 据结 构的 各种不 同 算 法 函 数 组 合 在 一 个 文 件 之 中 , 存 储 为 一 个 头 文 件 ( 如 取 名 为 seqlistAlgo.h) , 以 后 凡涉 及 到 要 使 用 本 文 件 中 的 顺 序 表 算 法 , 一 定 要 在 你 的 文 件 的 前 面 加 上
21、 一 条 #include“seqlistAlgo.h”即 可 , 无 需重 复定 义类 似的 算法 , 就 象使 用系 统函 数一 样 , 只 需进 行函 数原型 的声 明即 可。4 还 应包 含一 个 m ain函 数 , 作 为整 个程 序的 执行 入口 处 , 定 义测 试的 数据 , 完 成各 种算 法的 调用 执行 , 对 算法 的执 行过 程和 结果 进行 判断 和输 出控 制 , 存 储为 一个 源文 件 ( 如 取名 为 seqlistUse.cp) 。5 为 了对 实际 问题 更加 通用 和适 应 , 在 算法 中使 用的 数据 类型 为 Elem Type, 为 了与 实
22、际 数 据 类 型 一 致 , 一 般 要 将 Elem Type用 typedf重 定 义 : 如 实 际 问 题 中 顺 序 表 的 每 个 元 素是 整型 , 则 使用 typedfintElem Type; 定 义语 句 ; 如 实际 问题 中顺 序表 的每 个元 素是 单精 度实 数的 话, 使用 typedffloatElem Type; 定 义语 句。【 说明 2】 链 表的 定义 与操 作1 根 据一 个完 整的 C语 言组 成 , 将 实验 内容 组合 成如 上所 述的 三个 组成 部分 , 功 能清晰 明了 ,其 常量 定义 和常 用系 统函 数原 型声 明的 文件 “pu
23、bse.h”代 码复 用, 不需 另行 建立 。2 建立 一个 单链 表类 型定 义的 头文 件, 如取 名为 : linklistDef.h, 以后 凡使 用该 文件 定义 的类 型, 就只 需使 用包 含语 句 #include“linklistDef.h”即 可。3 关于 实验 内容 要完 成的 操作 ,一 般都 以独 立的 算法 出现 ,建 立一 个单 链表 的基 本算法 文件 ,将 各种 不同 算法 组合 在一 个文 件之 中, 存储 为一 个头 文件 如取 名为 : linklistAlgo.h,后 凡 涉 及 到 要 使 用 本 文 件 中 的 单 链 表 算 法 , 一 定 要
24、 在 你 的 文 件 的 前 面 加 上 一 条 #include“linklistAlgo.h”即 可 , 实 现 的 算 法 函 数 , 如 ListInit_Link、 ListInsert_Link、 ListDelte_Link、ListTravers_Link、 PriorElem _Link、 NextElem _Link、 GetElem _Link、 MergeList_Link等 ;4 还 应包 含一 个 m ain函 数 , 作 为整 个程 序的 执行 入口 处 , 定 义测 试的 数据 , 完 成各 种算 法的 调用 执行 , 对 算法 的执 行过 程和 结果 进行 判
25、断 和输 出控 制 , 存 储为 一个 源文 件 ( 如 取名 为 linklistUse.cp) 。四、基本实验的参考程序四、基本实验的参考程序四、基本实验的参考程序四、基本实验的参考程序(一)线性表的顺序存储结构的定义及其基本操作的参考程序(顺序表) (1)文 件 1: pubse.h是 公 共 使 用 的 常 量 定 义 和 系 统 函 数 调 用 声 明 , 以 后 每 个 实 验 中 几 乎都 涉及 到此 文件 。#include#include#include /*m aloc()等 */#include /*INT_MAX等 */#include /*EOF(=Z或 F6),NU
26、L*/#include /*atoi()*/#include /*eof()*/#include /*flor(),ceil(),abs()*/#include /*exit()*/*函 数结 果状 态代 码 */#defineTRUE1#defineFALSE0#defineOK1#defineEROR0#defineINFEASIBLE-1/*#defineOVERFLOW-2因 为在 m ath.h中 已定 义 OVERFLOW的 值为 3,故 去掉 此行 */typedfintStaus; /*Staus是 函数 的类 型 ,其 值是 函数 结果 状态 代码 ,如 OK等 */type
27、dfintBolean; /*Bolean是 布尔 类型 ,其 值是 TRUE或 FALSE*/(2)文 件 2: seqlistDef.h进 行线 性表 的动 态分 配顺 序存 储结 构的 表示#defineLIST_INIT_SIZE10/*线 性表 存储 空间 的初 始分 配量 */#defineLISTINCREMNT2/*线 性表 存储 空间 的分 配增 量 */typedfstructElem Type*elm ; /*存 储空 间基 址 */intlength; /*当 前长 度 */intlistize; /*当 前分 配的 存储 容量 (以 sizeof(Elem Type)
28、为 单位 )*/SqList;(3)文 件 3: seqlistAlgo.h进 行线 性表 顺序 存储 结构 的基 本实 验算 法定 义StausListInit_Sq(qList2.新 建 工 程 /Win32ConsoleAplication, 选 择 输 入 位 置 : 如 “d:”, 输 入 工 程 的 名 称 : 如“linklistDem o”; 按 “ 确 定 ” 按 钮, 选择 “ AnEm ptyProject” , 再按 “ 完 成 ” 按 钮,3 加载 实验 一中 的 pubse.h选 中菜 单的 “ project” “ adtoproject” -“ files”选
29、择已 存在 文件 ,确 定, 然后 一定 将文 件 pubse.h拷 贝到 所建 的工 程目 录下 ;4.新 建文 件 /C/+HeaderFile, 选 中 “ 添 加到 工程 的复 选按 钮 ” , 输 入文 件名 “ linklistDef.h” ,按 “ 确 定 ” 按 钮, 在显 示的 代码 编辑 区内 输入 如上 的参 考程 序;5.新 建文 件 /C/+HeaderFile, 选 中 “ 添 加到 工程 的复 选按 钮 ” , 输 入文 件名 “ linklistAlgo.h” ,按 “ 确 定 ” 按 钮, 在显 示的 代码 编辑 区内 输入 如上 的参 考程 序;6.新 建文
30、 件 /C+SourceFile, 选 中 “ 添 加到 工程 的复 选按 钮 ” , 输 入文 件名 “ linklistUse.cp” ,按 “ 确 定 ” 按 钮, 在显 示的 代码 编辑 区内 输入 如上 的参 考程 序;7 构件 、调 试、 运行 与 实验 一相 同, 在此 不再 复述 ;六、思考题六、思考题六、思考题六、思考题1 如 果将 所有 的常 量定 义 、 系 统函 数声 明 、 类 型定 义 、 算 法定 义以 及主 函数 全部 写在 一个文 件中 ,试 比较 其文 件的 组织 方式 。 2 如果 将顺 序表 的存 储分 配由 动态 分配 设计 为静 态分 配, 其算 法
31、该 如何 修改 ,比 较动 态和静 态分 配的 结果 对那 些算 法的 操作 有影 响?3 要 求 以 较 高 的 效 率 实 现 删 除 线 性 表 中 元 素 值 在 x到 y(X和 Y自 定 )之 间 的 所 有 元 素 , 写出 算法 。 【 参 考 解 题 思 路 】 在 线 性 表 中 设 置 两 个 初 值 为 O的 下 标 变 量 i和 j, 其 中 , i为 比 较 元 素 的下 标 , j为 赋 值 元 素 的 下 标 。 依 次 取 线 性 表 中 下 标 为 i的 元 素 与 x和 y比 较 , 假 若 是 x到 y之 外的 元素 , 则 赋值 给下 标为 J的 元索 。 这 种算 法比 删除 一个 元素 后立 即移 动其 后面 的元 素的 效率 高得 多。 4 利 用单 向链 表完 成一 个班 级的 一个 学期 的所 有课 程的 管理 :能 够增 加、 删除 、修 改学 生的 成绩 记录 。5 对于 同样 的一 组整 数, 比 较线 性表 的 两 种 不 同 存 储结 构的 特 点和 使用 场合 。