《算法与数据结构》实验指导书.docx
《《算法与数据结构》实验指导书.docx》由会员分享,可在线阅读,更多相关《《算法与数据结构》实验指导书.docx(14页珍藏版)》请在冰豆网上搜索。
《算法与数据结构》实验指导书
《算法与数据结构》
吴景岚王润鸿编撰
闽江学院计算机实验教学中心印制
目录
前言1
实验一顺序表基本操作的实现2
实验二链表基本操作的实现4
实验三串基本操作的实现6
实验四二叉树基本操作的实现8
实验五图基本操作的实现11
前言
《数据结构》是计算机科学与技术、软件工程等专业的专业基础必修课,主要介绍如何合理地组织数据、有效地存储和处理数据,正确地设计算法以及对算法进行分析和评价。
本课程的学习应使学生深刻地理解数据结构的逻辑结构和物理结构的基本概念及有关算法,培养学生基本的、良好的程序设计技能以及针对具体问题,选择适当的数据结构,设计出有效算法的能力。
《数据结构》是一门理论和实践相结合的课程,它在整个计算机专业教学体系中处于举足轻重的地位,是计算机科学的算法理论基础和软件设计的技术基础,其上机实验的目的主要是编程实现数据结构各章的主要算法,训练学生实际动手进行程序设计和程序调试的能力,加深对数据结构相关概念和算法的理解。
实验一顺序表基本操作的实现
专业:
计算机科学系嵌入式应用班级:
2班学号:
3141101212姓名:
粟代琼
实验地点:
工A207实验时间:
20151015指导教师:
陈雄峰
【实验课程名称】算法与数据结构
【实验项目名称】顺序表基本操作的实现
一、实验目的
1掌握线性表顺序存储基本操作;
2学会设计实验数据验证程序。
二、实验仪器及环境计算机,windowxp操作系统,VC++6.0
三、实验内容及步骤
线性表顺序存储基本操作
存储结构定义:
#defineLIST_INIT_SIZE100//线性表存储空间的初始分配量
#defineLISTINCREMENT10//线性表存储空间的分配增量
typedefstruct{
ElemType*elem;//存储空间基址
intlength;//当前长度
intlistsize;//当前分配的存储容量(以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学会设计实验数据验证程序。
二、实验仪器及环境计算机,windowxp操作系统,VC++6.0
三、实验内容及步骤
线性表链式存储基本操作
存储结构定义:
typedefstructLNode{
ElemTypedata;
structLNode*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学会设计实验数据验证程序。
二、实验环境
计算机,windowxp操作系统,VC++6.0
三、实验内容
1.存储结构定义:
#defineMAXSTRLEN255//串的长度最大为255
typedefunsignedcharSString[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 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学会设计实验数据验证程序。
二、实验环境
计算机,windowxp操作系统,VC++6.0
三、实验内容
1.存储结构定义:
typedefstructBiTNode{//结点定义
TElemTypedata;
structBiTNode*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学会设计实验数据验证程序。
二、实验环境
计算机,windowxp操作系统,VC++6.0
三、实验内容
1.存储结构定义:
#defineINFINITYINT_MAX; //最大值∞
#defineMAX_VERTEX_NUM20; //最大顶点个数
typedefenum{DG,DN,AG,AN}GraphKind;
//类型标志{有向图,有向网,无向图,无向网}
typedefstructArcCell{ //弧的定义
VRTypeadj; //VRType是顶点关系类型。
对无权图,用1或0
//表示相邻否;对带权图,则为权值类型。
InfoType*info; //该弧相关信息的指针
}AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct{ //图的定义
VertexTypevexs[MAX_VERTEX_NUM];//顶点信息
AdjMatrixarcs; //表示顶点之间关系的二维数组
intvexnum,arcnum; //图的当前顶点数和弧(边)数
GraphKindkind; //图的种类标志
}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中增添弧,若G是无向的,则还增添对称弧。
DeleteArc(&G,v,w);
初始条件:
图G存在,v和w是G中两个顶点。
操作结果:
在G中删除弧,若G是无向的,则还删除对称弧。
DFSTraverse(G,Visit());
初始条件:
图G存在,Visit是顶点的应用函数。
操作结果:
对图G进行深度优先遍历。
遍历过程中对每个顶点调用函数Visit一次且仅一次。
一旦visit()失败,则操作失败。
BFSTraverse(G,Visit());
初始条件:
图G存在,Visit是顶点的应用函数。
操作结果:
对图G进行广度优先遍历。
遍历过程中对每个顶点调用函数Visit一次且仅一次。
一旦visit()失败,则操作失败。
四、测试数据及实验结果
(参照前几个实验的测试