《算法与数据结构》实验指导书Word格式.docx
- 文档编号:17370240
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:14
- 大小:30.70KB
《算法与数据结构》实验指导书Word格式.docx
《《算法与数据结构》实验指导书Word格式.docx》由会员分享,可在线阅读,更多相关《《算法与数据结构》实验指导书Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
#defineLISTINCREMENT10//线性表存储空间的分配增量
typedefstruct{
ElemType*elem;
//存储空间基址
intlength;
//当前长度
intlistsize;
//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
实现的基本操作:
InitList(&
L)
操作结果:
构造一个空的线性表L。
DestroyList(&
初始条件:
线性表L已存在。
操作结果:
销毁线性表L。
ListLength(L)
返回L中元素个数。
PriorElem(L,cur_e,&
pre_e)
若cur_e是L中的数据元素,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。
NextElem(L,cur_e,&
next_e)
若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重置为空表。
PutElem(&
L,i,&
线性表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已存在且非空,1≤i≤LengthList(L)。
删除L的第i个元素,并用e返回其值,L的长度减1。
四、实验记录(自己设计测试数据验证算法的正确性)
五、
六、实验小结
七、思考题
1.线性表的顺序存储有何优缺点?
优点:
具有简单、运算方便等优点,特别是对于小线性表或长度固定的线性表,采用顺序存储结构的优越性更为突出;
缺点:
(1)顺序存储空间容易满,出现上溢,程序访问容易出问题,顺序存储结构下,存储空间不便扩充;
(2)顺序存储空间的分配问题,分多了浪费,分少了空间不足上溢
(3)顺序存储插入与删除一个元素,必须移动大了的数据元素,以此对大的线性表,特别是在元素的插入和删除很频繁的情况下,采取顺序存储很是不方便,效率低;
2.各举一两个例子说明求解什么样的问题用顺序存储较好。
【源代码说明】
1.文件名:
2.操作说明:
实验二链表基本操作的实现
班级:
学号:
姓名:
实验时间:
指导教师:
【实验项目名称】链表基本操作的实现
1掌握线性表链式存储基本操作;
线性表链式存储基本操作
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
ListEmpty(L)
线性表L已存在。
若L为空表,则返回TRUE,否则返回FALSE。
ListTraverse(L,visit())
初始条件:
线性表L已存在,visit()为元素的访问函数。
操作结果:
依次对L的每个元素调用函数visit()。
一旦visit()失败,则操作失败。
四、实验记录
(自己设计测试数据验证算法的正确性)
五、实验小结
六、思考题
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被销毁。
StrEmpty(S)
若S为空串,则返回TRUE,否则返回FALSE。
StrCompare(S,T)
串S和T存在。
若S>
T,则返回值=0;
若S=T,则返回值<
0;
若S<
T,则返回值<
0。
StrLength(S)
返回串S序列中的字符个数,即串的长度。
ClearString(&
将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掌握采用二叉链储存结构的二叉树基本操作;
3学会设计实验数据验证程序。
typedefstructBiTNode{//结点定义
TElemTypedata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
InitBiTree(&
T);
构造空二叉树T。
CreateBiTree(&
T,definition);
definition给出二叉树T的定义。
按definition构造二叉树T。
DestroyBiTree(&
二叉树T存在。
销毁二叉树T。
BiTreeEmpty(T);
若T为空二叉树,则返回TRUE,否则返回FALSE。
BiTreeDepth(T);
返回T的深度。
Root(T);
返回T的根。
Value(T,e);
二叉树T存在,e是T中某个结点。
返回e的值。
Parent(T,e);
若e是T的非根结点,则返回它的双亲,否则返回"
空"
。
LeftChild(T,e);
返回e的左孩子。
若e无左孩子,则返回"
RightChild(T,e);
返回e的右孩子。
若e无右孩子,则返回"
LeftSibling(T,e);
返回e的左兄弟。
若e是其双亲的左孩子或无左兄弟,则返回"
RightSibling(T,e);
二叉树T存在,e是T的结点。
返回e的右兄弟。
若e是其双亲的右孩子或无右兄弟,则返回"
PreOrderTraverse(T,visit());
二叉树T存在,visit是对结点操作的应用函数。
先序遍历T,对每个结点调用函数visit一次且仅一次。
一旦visit()失败,则操作失败。
InOrderTraverse(T,vsit());
中序遍历T,对每个结点调用函数Visit一次且仅一次。
PostOrderTraverse(T,visit());
二叉树T存在,visit是对结点操作的应用函数。
后序遍历T,对每个结点调用函数visit一次且仅一次。
LevelOrderTraverse(T,visit());
层序遍历T,对每个结点调用函数visit一次且仅一次。
ClearBiTree(&
将二叉树T清为空树。
Assign(&
T,&
e,value);
结点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掌握邻接矩阵储存结构的图基本操作;
#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;
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);
返回v的第一个邻接点。
若该顶点在G中没有邻接点,
则返回"
NextAdjVex(G,v,w);
图G存在,v是G中某个顶点,w是v的邻接顶点。
操作结果:
返回v的(相对于w的)下一个邻接点。
若w是v的最后一个邻接点,则返回"
PutVex(&
G,v,value);
初始条件:
操作结果:
对v赋值value。
InsertVex(&
G,v);
初始条件:
图G存在,v和图中顶点有相同特征。
操作结果:
在图G中增添新顶点v。
DeleteVex(&
删除G中顶点v及其相关的弧。
InsertArc(&
G,v,w);
图G存在,v和w是G中两个顶点。
在G中增添弧<
v,w>
,若G是无向的,则还增添对称弧<
w,v>
DeleteArc(&
在G中删除弧<
,若G是无向的,则还删除对称弧<
DFSTraverse(G,Visit());
图G存在,Visit是顶点的应用函数。
对图G进行深度优先遍历。
遍历过程中对每个顶点调用函数Visit一次且仅一次。
BFSTraverse(G,Visit());
对图G进行广度优先遍历。
(参照前几个实验的测试
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法与数据结构 算法 数据结构 实验 指导书