数据结构实验指导书v2Word文件下载.docx
- 文档编号:22151333
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:126
- 大小:154.70KB
数据结构实验指导书v2Word文件下载.docx
《数据结构实验指导书v2Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导书v2Word文件下载.docx(126页珍藏版)》请在冰豆网上搜索。
实验名称:
线性表
(一)59
堆栈
(二)61
队列(三)63
模式匹配(四)66
二叉树(五)68
查找(六)70
内部排序(七)72
图和图的遍历(八)76
设计性、综合性实验78
附录2数据结构课程设计完成情况登记表79
附录3图的应用80
实验一线性表
(一)实验目的
掌握线性表的顺序存储
掌握线性表的链式存储
掌握基本算法(建表、插入、删除)的实现
(二)实验内容
1.线性表的顺序存储:
掌握线性表的顺序存储结构及其基本操作、合并、逆置等算法
设顺序表的存储结构定义如下:
(同学们可扩展考虑其他形式的存储结构定义)
#defineLIST_INIT_SIZE100//线性表存储空间的初始分配量
#defineLISTINCREMENT10//线性表存储空间的分配增量
typedefstruct
{
int*elem;
//存储空间基址
intlength;
//当前长度
intlistsize;
//当前分配的存储容量(以sizeof(int)为单位)
}SqList;
[题目1:
编写算法,创建初始化容量为LIST_INIT_SIZE的顺序表T,并实现插入、删除、遍历操作。
本题目给出部分代码,请补全内容。
]
#include<
stdio.h>
malloc.h>
#defineOK1
#defineERROR0
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
#defineElemTypeint
int*elem;
intInitList_Sq(SqList&
L)
//算法2.3,构造一个空的线性表L,该线性表预定义大小为LIST_INIT_SIZE
//请补全代码
}
intLoad_Sq(SqList&
//输出顺序表中的所有元素
inti;
if()printf("
TheListisempty!
"
);
//请填空
else
{
printf("
TheListis:
"
for()printf("
%d"
);
}
printf("
\n"
returnOK;
intListInsert_Sq(SqList&
L,inti,inte)
//算法2.4,在顺序线性表L中第i个位置之前插入新的元素e
//i的合法值为1≤i≤L.length+1
intListDelete_Sq(SqList&
L,inti,int&
e)
//算法2.5,在顺序线性表L中删除第i个位置的元素,并用e返回其值
//i的合法值为1≤i≤L.length
intmain()
SqListT;
inta,i;
ElemTypee,x;
if()//判断顺序表是否创建成功,请填空
ASequenceListHasCreated.\n"
while
(1)
1:
Insertelement\n2:
Deleteelement\n3:
Loadallelements\n0:
Exit\nPleasechoose:
scanf("
%d"
&
a);
switch(a)
{
case1:
scanf("
%d%d"
i,&
x);
if()printf("
InsertError!
//判断i值是否合法,请填空
elseprintf("
TheElement%disSuccessfullyInserted!
x);
break;
case2:
i);
DeleteError!
TheElement%disSuccessfullyDeleted!
e);
case3:
Load_Sq(T);
case0:
return1;
}
测试样例格式说明:
根据菜单操作:
1、输入1,表示要实现插入操作,紧跟着要输入插入的位置和元素,用空格分开
2、输入2,表示要实现删除操作,紧跟着要输入删除的位置
3、输入3,表示要输出顺序表的所有元素
4、输入0,表示程序结束
[题目2:
编写算法,将两个非递减有序顺序表A和B合并成一个新的非递减有序顺序表C。
本题不提供代码,请同学们独立完成,所需子函数参考前面题目1完成的内容。
[键盘输入]
第一行:
顺序表A的元素个数
第二行:
顺序表A的各元素(非递减),用空格分开
第三行:
顺序表B的元素个数
第四行:
顺序表B的各元素(非递减),用空格分开
[正确输出]
顺序表A的元素列表
顺序表B的元素列表
合并后顺序表C的元素列表
测试样例:
[第一组自测数据]
[键盘输入]
5↙
13579↙
246810↙
[正确输出]
ListA:
13579
ListB:
246810
ListC:
12345678910
[第二组自测数据]
6↙
122445628496↙
4↙
15317586↙
122445628496
15317586
12152431456275848696
[题目3:
设有一顺序表A=(a0,a1,...,ai,...an-1),其逆顺序表定义为A'
=(an-1,...,ai,...,a1,a0)。
设计一个算法,将顺序表逆置,要求顺序表仍占用原顺序表的空间。
输入顺序表的元素个数
输入顺序表的各元素,用空格分开
逆置前的顺序表元素列表
逆置后的顺序表元素列表
10↙
12345678910↙
TheturnedListis:
10987654321
8↙
3297546535846175↙
3297546535846175
7561843565549732
2.线性表的链式存储:
掌握线性表的链式存储结构及其基本操作、合并、逆置等算法。
本实验以单链表为例,在完成题目的过程中,同学们可扩展考虑双链表及循环链表等结构的操作。
设单链表的存储结构定义如下:
typedefstructLNode
intdata;
//存储在结点中的数据
structLNode*next;
//指向下一结点的指针
}LNode,*LinkList;
[题目4:
编写算法,创建一个含有n个元素的带头结点的单链表L并实现插入、删除、遍历操作。
本题目提供部分代码,请补全内容]
intCreateLink_L(LinkList&
L,intn){
//创建含有n个元素的单链表
LinkListp,q;
ElemTypee;
L=(LinkList)malloc(sizeof(LNode));
L->
next=NULL;
//先建立一个带头结点的单链表
q=(LinkList)malloc(sizeof(LNode));
q=L;
for(i=0;
i<
n;
i++){
&
e);
p=(LinkList)malloc(sizeof(LNode));
//生成新结点
//请补全代码
intLoadLink_L(LinkList&
L){
//单链表遍历
LinkListp=L->
next;
if()printf("
TheLinkListis:
while()//请填空
p->
data);
//请填空
intLinkInsert_L(LinkList&
L,inti,ElemTypee){
//算法2.9
//在带头结点的单链线性表L中第i个位置之前插入元素e
intLinkDelete_L(LinkList&
L,inti,ElemType&
e){
//算法2.10
//在带头结点的单链线性表L中,删除第i个元素,并用e返回其值
LinkListT;
inta,n,i;
ElemTypex,e;
Pleaseinputtheinitsizeofthelinklist:
n);
Pleaseinputthe%delementofthelinklist:
n);
if()//判断链表是否创建成功,请填空
ALinkListHasCreated.\n"
LoadLink_L(T);
if()printf("
elseprintf("
break;
[题目5:
设计一个算法将两个非递减有序链表A和B合并成一个新的非递减有序链表C。
本题不提供代码,请同学们独立完成,所需子函数参考题目4完成的内容。
单链表A的元素个数
单链表A的各元素(非递减),用空格分开
单链表B的元素个数
单链表B的各元素(非递减),用空格分开
单链表A的元素列表
单链表B的元素列表
合并后单链表C的元素列表
[题目6:
设有一线性表A=(a0,a1,...,ai,...an-1),其逆线性表定义为A'
=(an-1,...,ai,...,a1,a0),设计一个算法,将链式线性表逆置,要求线性表仍占用原线性表的空间。
输入n,表示单链表的元素个数
输入单链表的各元素,用空格分开
输出单链表逆置前的元素列表
输出单链表逆置后的元素列表
8↙
7562843565549732
(三)实验报告
本实验所有题目要求在JudgeOnline上提交通过。
实验报告针对以上所有实验内容。
实验目的主要是阐述本实验需要掌握的知识要点。
实验总结主要是对实验内容的掌握及理解程序作一个归纳性的叙述。
对于思考题进行分析和思考,并做出相应的结论。
本次实验报告可以在堂下完成。
实验二堆栈
(1)理解堆栈的结构及操作特点
(2)实现堆栈的PUSH、POP等基本操作算法
(3)熟练掌握入栈、出栈时栈顶指针的变化情况
(4)掌握堆栈的实际应用
1.顺序栈的基本操作
创建一个空的顺序栈,并实现栈的入栈、出栈、返回栈的长度、返回栈顶元素、栈的遍历等基本算法。
请将下面的程序补充完整。
#defineOK1
#defineSTACK_INIT_SIZE100//存储空间初始分配量
#defineSTACKINCREMENT10//存储空间分配增量
typedefintSElemType;
//定义栈元素类型
typedefintStatus;
//Status是函数的类型,其值是函数结果状态代码,如OK等
structSqStack
SElemType*base;
//在栈构造之前和销毁之后,base的值为NULL
SElemType*top;
//栈顶指针
intstacksize;
//当前已分配的存储空间,以元素为单位
};
//顺序栈
StatusInitStack(SqStack&
S)
{
//构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE
StatusPush(SqStack&
S,SElemTypee)
//在栈S中插入元素e为新的栈顶元素
StatusPop(SqStack&
S,SElemType&
e)
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;
否则返回ERROR
StatusGetTop(SqStackS,SElemType&
//若栈不空,则用e返回S的栈顶元素,并返回OK;
intStackLength(SqStackS)
//返回栈S的元素个数
StatusStackTraverse(SqStackS)
//从栈顶到栈底依次输出栈中的每个元素
SElemType*p=(SElemType*)malloc(sizeof(SElemType));
p=//请填空
TheStackisEmpty!
//请填空
TheStackis:
p--;
while()//请填空
printf("
*p);
//请填空
inta;
SqStackS;
SElemTypex,e;
AStackHasCreated.\n"
while
(1)
Push\n2:
Pop\n3:
GettheTop\n4:
ReturntheLengthoftheStack\n5:
LoadtheStack\n0:
if()printf("
PushError!
//判断Push是否合法,请填空
elseprintf("
TheElement%disSuccessfullyPushed!
break;
case2:
PopError!
//判断Pop是否合法,请填空
elseprintf("
TheElement%disSuccessfullyPoped!
break;
case3:
GetTopError!
//判断GetTop是否合法,请填空
TheTopElementis%d!
case4:
TheLengthoftheStackis%d!
case5:
//请填空
1、输入1,表示要实现Push操作,紧跟着输入要Push的元素
2、输入2,表示要实现Pop操作
3、输入3,返回栈顶元素
4、输入4,返回栈的元素个数
5、输入5,表示从栈顶到栈底输出栈的所有元素
6、输入0,表示程序结束
2.栈的应用
[题目2:
利用顺序栈的基本操作算法,编写满足下列要求的数制转换程序:
对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数。
输入一个非负的十进制整数
[正确输出]
与输入等值的八进制数
测试样例
[第一组自测数据][第二组自测数据]
[键盘输入][键盘输入]
15↙38↙
[正确输出][正确输出]
1746
利用栈编写满足下列要求的括号匹配检验程序:
假设表达式中允许包含两种括号:
圆括号和方括号,其嵌套的顺序随意,即([]())或[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式。
输入一个包含上述括号的表达式,检验括号是否配对。
本题给出部分chech()函数,要求将check()函数补充完整,并完成整个程序。
typedefcharSElemType;
math.h>
process.h>
//exit()
#defineTRUE1
#defineFALSE0
#defineSTACK_INIT_SIZE10//存储空间初始分配量
#defineSTACKINCREMENT2//存储空间分配增量
S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 指导书 v2
![提示](https://static.bdocx.com/images/bang_tan.gif)