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