《算法与数据结构》实验指导书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法与数据结构》吴景岚王润鸿编撰
闽江学院计算机实验教学中心印制
目录
前言 (1)
实验一顺序表基本操作的实现 (2)
实验二链表基本操作的实现 (4)
实验三串基本操作的实现 (7)
实验四二叉树基本操作的实现 (9)
实验五图基本操作的实现 (12)
前言
《数据结构》是计算机科学与技术、软件工程等专业的专业基础必修课,主要介绍如何合理地组织数据、有效地存储和处理数据,正确地设计算法以及对算法进行分析和评价。
本课程的学习应使学生深刻地理解数据结构的逻辑结构和物理结构的基本概念及有关算法,培养学生基本的、良好的程序设计技能以及针对具体问题,选择适当的数据结构,设计出有效算法的能力。
《数据结构》是一门理论和实践相结合的课程,它在整个计算机专业教学体系中处于举足轻重的地位,是计算机科学的算法理论基础和软件设计的技术基础,其上机实验的目的主要是编程实现数据结构各章的主要算法,训练学生实际动手进行程序设计和程序调试的能力,加深对数据结构相关概念和算法的理解。
实验一顺序表基本操作的实现
专业:计算机科学系嵌入式应用班级: 2班学号: 3141101212 姓
名:粟代琼
实验地点:工A207 实验时间: 2015 10 15 指导教师:陈雄峰【实验课程名称】算法与数据结构
【实验项目名称】顺序表基本操作的实现
一、实验目的
1掌握线性表顺序存储基本操作;
2学会设计实验数据验证程序。
二、实验仪器及环境计算机,window xp操作系统,VC++6.0
三、实验内容及步骤
线性表顺序存储基本操作
存储结构定义:
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct{
ElemType *elem; //存储空间基址
int length;//当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
实现的基本操作:
InitList( &L )
操作结果:构造一个空的线性表 L 。
DestroyList( &L )
初始条件:线性表 L 已存在。
操作结果:销毁线性表 L 。
ListLength( L )
初始条件:线性表 L 已存在。
操作结果:返回 L 中元素个数。
PriorElem( L, cur_e, &pre_e )
初始条件:线性表 L 已存在。
操作结果:若 cur_e 是 L 中的数据元素,则用 pre_e 返回它的前驱,
否则操作失败,pre_e 无定义。
NextElem( L, cur_e, &next_e )
初始条件:线性表 L 已存在。
操作结果:若 cur_e 是 L 中的数据元素,则用 next_e 返回它的后继,否则操作失败,next_e 无定义。
GetElem( L, i, &e )
初始条件:线性表 L 已存在,1≤i≤LengthList(L)。
操作结果:用 e 返回 L 中第 i 个元素的值。
LocateElem( L, e, compare( ) )
初始条件:线性表 L 已存在,compare( ) 是元素判定函数。
操作结果:返回 L 中第1个与 e满足关系 compare( )的元素的位序。
若这样的元素不存在,则返回值为0。
ClearList( &L )
初始条件:线性表 L 已存在。
操作结果:将 L 重置为空表。
PutElem( &L, i, &e )
初始条件:线性表L已存在,1≤i≤LengthList(L)。
操作结果:L 中第 i 个元素赋值同 e 的值。
ListInsert( &L, i, e )
初始条件:线性表 L 已存在,1≤i≤LengthList(L)+1。
操作结果:在 L 的第 i 个元素之前插入新的元素 e,L 的长度增1。
ListDelete( &L, i, &e )
初始条件:线性表 L 已存在且非空,1≤i≤LengthList(L)。
操作结果:删除L 的第 i 个元素,并用 e 返回其值,L 的长度减1。
四、实验记录(自己设计测试数据验证算法的正确性)
五、
六、实验小结
七、思考题
1.线性表的顺序存储有何优缺点?
优点:具有简单、运算方便等优点,特别是对于小线性表或长度固定的线性表,采用顺序存储结构的优越性更为突出;
缺点:
(1)顺序存储空间容易满,出现上溢,程序访问容易出问题,顺序存储结构下,存储空间不便扩充;
(2)顺序存储空间的分配问题,分多了浪费,分少了空间不足上溢
(3)顺序存储插入与删除一个元素,必须移动大了的数据元素,以此对大的线性表,特别是在元素的插入和删除很频繁的情况下,采取顺序存储
很是不方便,效率低;
2.各举一两个例子说明求解什么样的问题用顺序存储较好。
【源代码说明】
1.文件名:
2.操作说明:
实验二链表基本操作的实现
专业:班级:学号:姓名:
实验地点:实验时间:指导教师:
【实验课程名称】算法与数据结构
【实验项目名称】链表基本操作的实现
一、实验目的
1掌握线性表链式存储基本操作;
2学会设计实验数据验证程序。
二、实验仪器及环境计算机,window xp操作系统,VC++6.0
三、实验内容及步骤
线性表链式存储基本操作
存储结构定义:
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
实现的基本操作:
InitList( &L )
操作结果:构造一个空的线性表 L 。
DestroyList( &L )
初始条件:线性表 L 已存在。
操作结果:销毁线性表 L 。
ListEmpty( L )
初始条件:线性表L已存在。
操作结果:若 L 为空表,则返回 TRUE,否则返回 FALSE。
ListLength( L )
初始条件:线性表 L 已存在。
操作结果:返回 L 中元素个数。
PriorElem( L, cur_e, &pre_e )
初始条件:线性表 L 已存在。
操作结果:若 cur_e 是 L 中的数据元素,则用 pre_e 返回它的前驱,否则操作失败,pre_e 无定义。
NextElem( L, cur_e, &next_e )
初始条件:线性表 L 已存在。
操作结果:若 cur_e 是 L 中的数据元素,则用 next_e 返回它的后继,否则操作失败,next_e 无定义。
GetElem( L, i, &e )
初始条件:线性表 L 已存在,1≤i≤LengthList(L)。
操作结果:用 e 返回 L 中第 i 个元素的值。
LocateElem( L, e, compare( ) )
初始条件:线性表 L 已存在,compare( ) 是元素判定函数。
操作结果:返回 L 中第1个与 e满足关系 compare( )的元素的位序。
若这样的元素不存在,则返回值为0。
ListTraverse(L, visit( ))
初始条件:线性表 L 已存在,visit( ) 为元素的访问函数。
操作结果:依次对 L 的每个元素调用函数visit( )。
一旦visit( ) 失败,则操作失败。
ClearList( &L )
初始条件:线性表 L 已存在。
操作结果:将 L 重置为空表。
PutElem( &L, i, &e )
初始条件:线性表L已存在,1≤i≤LengthList(L)。
操作结果:L 中第 i 个元素赋值同 e 的值。
ListInsert( &L, i, e )
初始条件:线性表 L 已存在,1≤i≤LengthList(L)+1。
操作结果:在 L 的第 i 个元素之前插入新的元素 e,L 的长度增1。
ListDelete( &L, i, &e )
初始条件:线性表 L 已存在且非空,1≤i≤LengthList(L)。
操作结果:删除L 的第 i 个元素,并用 e 返回其值,L 的长度减1。
四、实验记录
(自己设计测试数据验证算法的正确性)
五、实验小结
六、思考题
1.线性表的链式存储有何优缺点?
2.各举一两个例子说明求解什么样的问题用链式存储较好。
【源代码说明】
1.文件名:
2.操作说明:
实验三串基本操作的实现
专业:班级:学号:姓名:
实验地点:实验时间:指导教师:
【实验课程名称】算法与数据结构
【实验项目名称】串基本操作的实现
一、实验目的
1 理解定长顺序串的存储结构及基本操作的定义;
2 掌握定长顺序串的基本操作;
3 学会设计实验数据验证程序。
二、实验环境
计算机,window xp操作系统,VC++6.0
三、实验内容
1. 存储结构定义:
#define MAXSTRLEN 255 //串的长度最大为255
typedef unsigned char SString[MAXSTRLEN+1];
//0号单元存放串的长度,其最大值刚好是255
2. 实现的基本操作:
StrAssign (&T, chars)
初始条件:chars 是串常量。
操作结果:赋于串T的值为chars。
StrCopy (&T, S)
初始条件:串S 存在。
操作结果:由串S 复制得串T。
DestroyString (&S)
初始条件:串S 存在。
操作结果:串S 被销毁。
StrEmpty (S)
初始条件:串S 存在。
操作结果:若S 为空串,则返回TRUE,否则返回FALSE。
StrCompare (S, T)
初始条件:串S 和T 存在。
操作结果:若S>T,则返回值=0;若S=T,则返回值<0;若S<T,则返回值<0。
StrLength (S)
初始条件:串S 存在。
操作结果:返回串S 序列中的字符个数,即串的长度。
ClearString (&S)
初始条件:串S 存在。
操作结果:将S 清为空串。
Concat (&T, S1, S2)
初始条件:串S1 和S2 存在。
操作结果:用T 返回由S1 和S2 联接而成的新串。
SubString (&Sub, S, pos, len)
初始条件:串S存在,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1。
操作结果:用Sub 返回串S的第pos 个字符起长度为len 的子串。
Index (S, T, pos)
初始条件:串S和T存在,T 是非空串,1≤pos≤StrLength(S)。
操作结果:若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。
Replace (&S, T, V)
初始条件:串S,T 和V 存在,T 是非空串。
操作结果:用V替换主串S中出现的所有与T相等的不重叠的子串。
StrInsert (&S, pos, T)
初始条件:串S 和T 存在,1≤pos≤StrLength(S)+1。
操作结果:在串S 的第pos 个字符之前插入串T。
StrDelete (&S, pos, len)
初始条件:串S 存在,1≤pos≤StrLength(S)-len+1。
操作结果:从串S 中删除第pos 个字符起长度为len 的子串。
四、测试及实验结果
(1) 建立如下字符串S1:
“输入结点值的顺序必须对应二叉树结点前序遍历的顺序。
并约定以输入序列中不可能出现的值作为空结点的值以结束递归。
”
(2) 输出S1;
(3) 查找“二叉树”出现的位序;
(4) 将文中的”顺序”改为”次序”;
(5) 建立如下字符串S2:
例如用“@”或用“-1”表示字符序列或正整数序列空结点。
(6) 将S1串与S2串连接成S串;
(7) 输出S串的值与串的长度;
(8) 删除S1串和S2串;
五、实验小结
六、思考题
定长顺序串的存储结构与c语言中用字符指针存储字符串相比有何优点?
【源代码说明】
1.文件名:
2.操作说明:
实验四二叉树基本操作的实现
专业:班级:学号:姓名:
实验地点:实验时间:指导教师:
【实验课程名称】算法与数据结构
【实验项目名称】二叉树基本操作的实现
一、实验目的
1 理解二叉树概念及其存储结构;
2掌握采用二叉链储存结构的二叉树基本操作;
3学会设计实验数据验证程序。
二、实验环境
计算机,window xp操作系统,VC++6.0
三、实验内容
1. 存储结构定义:
typedef struct BiTNode { //结点定义
TElemType data;
struct BiTNode * lchild, * rchild;
} BiTNode,*BiTree;
2. 实现的基本操作:
InitBiTree(&T);
操作结果:构造空二叉树T。
CreateBiTree(&T, definition);
初始条件:definition 给出二叉树T 的定义。
操作结果:按definition 构造二叉树T。
DestroyBiTree(&T);
初始条件:二叉树T 存在。
操作结果:销毁二叉树T。
BiTreeEmpty(T);
初始条件:二叉树T 存在。
操作结果:若T为空二叉树,则返回TRUE,否则返回FALSE。
BiTreeDepth(T);
初始条件:二叉树T 存在。
操作结果:返回T 的深度。
Root(T);
初始条件:二叉树T 存在。
操作结果:返回T 的根。
Value(T, e);
初始条件:二叉树T 存在,e 是T 中某个结点。
操作结果:返回 e 的值。
Parent(T, e);
初始条件:二叉树T 存在,e 是T 中某个结点。
操作结果:若e是T的非根结点,则返回它的双亲,否则返回"空"。
LeftChild(T, e);
初始条件:二叉树T 存在,e 是T 中某个结点。
操作结果:返回 e 的左孩子。
若 e 无左孩子,则返回"空"。
RightChild(T, e);
初始条件:二叉树T 存在,e 是T 中某个结点。
操作结果:返回 e 的右孩子。
若 e 无右孩子,则返回"空"。
LeftSibling(T, e);
初始条件:二叉树T 存在,e 是T 中某个结点。
操作结果:返回 e 的左兄弟。
若 e 是其双亲的左孩子或无左兄弟,则返回"空"。
RightSibling(T, e);
初始条件:二叉树T 存在,e 是T 的结点。
操作结果:返回 e 的右兄弟。
若 e 是其双亲的右孩子或无右兄弟,则返回"空"。
PreOrderTraverse(T, visit());
初始条件:二叉树T 存在,visit 是对结点操作的应用函数。
操作结果:先序遍历T,对每个结点调用函数visit 一次且仅一次。
一旦visit() 失败,则操作失败。
InOrderTraverse(T, vsit());
初始条件:二叉树T 存在,visit 是对结点操作的应用函数。
操作结果:中序遍历T,对每个结点调用函数Visit 一次且仅一次。
一旦visit() 失败,则操作失败。
PostOrderTraverse(T, visit());
初始条件:二叉树T存在,visit 是对结点操作的应用函数。
操作结果:后序遍历T,对每个结点调用函数visit 一次且仅一次。
一旦visit() 失败,则操作失败。
LevelOrderTraverse(T, visit());
初始条件:二叉树T 存在,visit 是对结点操作的应用函数。
操作结果:层序遍历T,对每个结点调用函数visit 一次且仅一次。
一旦visit() 失败,则操作失败。
ClearBiTree(&T);
初始条件:二叉树T 存在。
操作结果:将二叉树T 清为空树。
Assign(&T, &e, value);
初始条件:二叉树T 存在,e 是T 中某个结点。
操作结果:结点 e 赋值为value。
InsertChild(&T, p, LR, c);
初始条件:二叉树T 存在,p 指向T 中某个结点,LR 为0 或1,非空二叉树c 与T 不相交且右子树为空。
操作结果:根据LR 为0 或1,插入 c 为T 中p 所指结点的左或右子树。
p 所指结点原有左或右子树成为 c 的右子树。
DeleteChild(&T, p, LR);
初始条件:二叉树T 存在,p 指向T 中某个结点,LR 为0 或1。
操作结果:根据LR 为0 或1,删除T 中p 所指结点的左或右子树。
四、测试数据及实验结果
(参照前几个实验的测试方法自己设计测试数据验证算法的正确性)
五、实验小结
六、思考题
1举例说明什么样的二叉树采用顺序存储,什么样的二叉树采用二叉链存储。
2总结编程调试过程中遇到的问题,你采取的解决方案。
若未能测试通过所有操作,请分析原因。
【源代码说明】
1.文件名:
2.操作说明:
实验五图基本操作的实现
专业:班级:学号:姓名:
实验地点:实验时间:指导教师:
【实验课程名称】算法与数据结构
【实验项目名称】图基本操作的实现
一、实验目的
1 理解图的存储结构;
2掌握邻接矩阵储存结构的图基本操作;
3学会设计实验数据验证程序。
二、实验环境
计算机,window xp操作系统,VC++6.0
三、实验内容
1. 存储结构定义:
#define INFINITY INT_MAX; // 最大值∞
#define MAX_VERTEX_NUM 20;// 最大顶点个数
typedef enum {DG, DN, AG, AN} GraphKind;
// 类型标志{有向图,有向网,无向图,无向网} typedef struct ArcCell { // 弧的定义
VRType adj; // VRType是顶点关系类型。
对无权图,用1或0
//表示相邻否;对带权图,则为权值类型。
InfoType *info; // 该弧相关信息的指针} AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct { // 图的定义
VertexType vexs[MAX_VERTEX_NUM]; // 顶点信息
AdjMatrix arcs; // 表示顶点之间关系的二维数组
int vexnum, arcnum; // 图的当前顶点数和弧(边)数
GraphKind kind; // 图的种类标志} MGraph;
2. 实现的基本操作:
CreateGraph(&G, V, VR);
初始条件:V 是图的顶点集,VR 是图中弧的集合。
操作结果:按V 和VR 的定义构造图G。
DesstroyGraph(&G);
初始条件:图G 存在。
操作结果:销毁图G。
LocateVex(G, u);
初始条件:图G 存在,u 和G 中顶点有相同特征。
操作结果:若G 中存在和u 相同的顶点,则返回该顶点在图中位置;
否则返回其它信息。
GetVex(G, v);
初始条件:图G 存在,v 是G 中某个顶点。
操作结果:返回v 的值。
FirstAdjVex(G, v);
初始条件:图G 存在,v 是G 中某个顶点。
操作结果:返回v 的第一个邻接点。
若该顶点在G 中没有邻接点,
则返回"空"。
NextAdjVex(G, v, w);
初始条件:图G 存在,v 是G 中某个顶点,w 是v 的邻接顶点。
操作结果:返回v 的(相对于w 的)下一个邻接点。
若w 是v
的最后一个邻接点,则返回"空"。
PutVex(&G, v, value);
初始条件:图G 存在,v 是G 中某个顶点。
操作结果:对v 赋值value。
InsertVex(&G, v);
初始条件:图G 存在,v 和图中顶点有相同特征。
操作结果:在图G 中增添新顶点v。
DeleteVex(&G, v);
初始条件:图G 存在,v 是G 中某个顶点。
操作结果:删除G 中顶点v 及其相关的弧。
InsertArc(&G, v, w);
初始条件:图G 存在,v 和w 是G 中两个顶点。
操作结果:在G 中增添弧<v,w>,若G 是无向的,则还增添对称
弧<w,v>。
DeleteArc(&G, v, w);
初始条件:图G 存在,v 和w 是G 中两个顶点。
操作结果:在G 中删除弧<v,w>,若G 是无向的,则还删除对称
弧<w,v>。
DFSTraverse(G, Visit());
初始条件:图G 存在,Visit 是顶点的应用函数。
操作结果:对图G 进行深度优先遍历。
遍历过程中对每个顶点调
用函数Visit 一次且仅一次。
一旦visit() 失败,则操作失败。
BFSTraverse(G, Visit());
初始条件:图G 存在,Visit 是顶点的应用函数。
操作结果:对图G 进行广度优先遍历。
遍历过程中对每个顶点调
用函数Visit 一次且仅一次。
一旦visit() 失败,则操作失败。
四、测试数据及实验结果
(参照前几个实验的测试方法自己设计测试数据验证算法的正确性)
五、实验小结
六、思考题
1与图的邻接表存储方式相比,邻接矩阵存储有何有缺点。
2总结编程调试过程中遇到的问题,你采取的解决方案。
若未能测试通过所有操作,请分析原因。
【源代码说明】
1.文件名:
2.操作说明:。