《数据结构B》实验指导书.docx
- 文档编号:9701244
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:94
- 大小:91.84KB
《数据结构B》实验指导书.docx
《《数据结构B》实验指导书.docx》由会员分享,可在线阅读,更多相关《《数据结构B》实验指导书.docx(94页珍藏版)》请在冰豆网上搜索。
《数据结构B》实验指导书
湖北汽车汽车工业学院
《数据结构B》
实验指导书
袁科、马春江、付勇智
编写
计算机工程系
目录
实验一线性表基本操作的编程实现2
实验二堆栈和队列基本操作的编程实现12
实验三串基本操作的编程实现20
实验四二维数组基本操作的编程实现28
实验五二叉树基本操作的编程实现33
实验六图基本操作的编程实现41
实验七查找技术的编程实现50
实验八排序技术的编程实现57
附录一实验常见问题问答64
附录二如何准备实验64
附录三如何写实验报告65
附录四实验报告模板66
附录五实验注意事项70
(特别提示:
程序设计包含两个方面的错误。
其一是语法错误,其二是功能错误。
为了提高学生的编程和调试能力,本指导书给出的程序代码并不保证没有上述的两种错误。
并且也不保证程序的完整性,有一些语句已经故意删除,就是要求学生自己编制完成,这样才能达到我们的教学要求。
希望大家以自己所学高级语言的基本功和数据结构原理的思考点为基础,不要过于依赖给出的参考代码,这样才能有所进步。
如果学生能够根据要求完全自己编制,那就更好了。
)
实验一线性表基本操作的编程实现
【实验目的】
线性表基本操作的编程实现
要求:
线性表基本操作的编程实现(2学时,验证型),掌握线性表的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、逆序、排序等操作,存储结构可以在顺序结构或链表结构中任选,可以完成部分主要功能,也可以用菜单进行管理完成大部分功能。
还鼓励学生利用基本操作进行一些更实际的应用型程序设计。
【实验性质】
验证性实验(学时数:
2H)
【实验内容】
把线性表的顺序存储和链表存储的数据插入、删除运算其中某项进行程序实现。
建议实现键盘输入数据以实现程序的通用性。
为了体现功能的正常性,至少要编制遍历数据的函数。
【注意事项】
1.开发语言:
使用C。
2.可以自己增加其他功能。
【参考代码】(以下内容,学生任意选择一个完成即可)
(一)基础篇
//利用顺序表完成一个班级学生课程成绩的简单管理
#include
#include
#include
#defineMAXSIZE100//根据需要自己设定一个班级能够容纳的最大学生数
typedefstructstu
{
intnum;//学生学号
charname[10];//学生姓名
floatscore;//学生成绩
}STUDENT;//存放单个学生信息的结构体类型
typedefstructlist
{
STUDENTstu[MAXSIZE];//存放学生的数组定义,静态分配空间
intlength;//记录班级实际学生个数
}LIST;//存放班级学生信息的顺序表类型
voidlistcreate(LIST*Li,intm)
//初始化班级的学生信息
//m为该班级的初始人数
{
inti;
Li->length=0;
for(i=1;i<=m;i++)//输入m个学生的所有信息
{
printf("请输入第%d个学生的信息:
\n",i);
printf("学号=");
scanf("%d",&Li->stu[i].num);//输入第i个学生的学号
printf("姓名=");
scanf("%s",&Li->stu[i].name);//输入第i个学生的姓名
printf("成绩=");
scanf("%f",&Li->stu[i].score);//输入第i个学生的成绩
Li->length++;//学生人数加1
}
}
intlistinsert(LIST*Li,inti)
//将学生插入到班级Li的第i个位置。
//插入一个学生信息
{
intj;
STUDENTe;
if(Li->length>=MAXSIZE-1)
//测试存储空间是否被占满
{
printf("无更多的存储空间!
\n");
return0;
}
if(i<=0||i>=Li->length+2)
//插入位置检验,如果错误就返回0退出程序。
{
printf("插入位置有误!
\n");
return0;
}
else
{
printf("请输入插入的学生信息:
\n");
printf("学号=");
scanf("%d",&e.num);
printf("姓名=");
scanf("%s",e.name);
printf("成绩=");
scanf("%f",&e.score);
;//利用for循环将第i个及其后面的元素依次往后移动
;//移开位置后将学生e放入到i位置
;//完成插入后,学生实际人数加1
return1;
}
}
intlistdel(LIST*Li,inti)
//删除一个学生信息
//删除第i个学生的信息
{
intj;
if(i<=0||i>Li->length)//删除位置检验,如果错误就返回0退出程序。
return0;
else
{
;//利用for循环将准备删除的第i个及其后面的元素依次往前移动
;//删除第i个学生后,学生人数减1
return1;
}
}
voidlistdisplay(LISTL)
{//显示所有学生信息
inti;
//printf("班级学生信息如下:
\n");
printf("学号姓名成绩\n");
for(i=1;i<=L.length;i++)
printf("%10d%10s%10.2f\n",L.stu[i].num,L.stu[i].name,L.stu[i].score);
}
voidshowmenu()
{//显示菜单
printf("欢迎使用成绩管理小软件\n");
printf("\t1、创建学生信息\n");
printf("\t2、插入学生信息\n");
printf("\t3、删除学生信息\n");
printf("\t4、显示学生信息\n");
printf("\t5、退出程序\n");
}
voidmain()
{
intno,stu_count,pos;
LISTstu_info;
while
(1)
{
showmenu();
printf("请输入你的选择:
");
scanf("%d",&no);
switch(no)
{
case1:
printf("班级信息初始化,按任意键继续……\n");
getch();
printf("请输入班级学生原始人数:
");
scanf("%d",&stu_count);
listcreate(&stu_info,stu_count);
system("cls");
showmenu();
listdisplay(stu_info);
printf("班级信息初始化已经完成,按任意键继续……\n");
getch();
system("cls");
break;
case2:
printf("插入前班级信息:
\n");
listdisplay(stu_info);
printf("请输入插入位置:
");
scanf("%d",&pos);
listinsert(&stu_info,pos);
printf("插入后班级信息:
\n");
listdisplay(stu_info);
printf("插入已经完成,按任意键继续……\n");
getch();
system("cls");
break;
case3:
printf("删除前班级信息:
\n");
listdisplay(stu_info);
printf("请输入删除位置:
");
scanf("%d",&pos);
listdel(&stu_info,pos);
printf("删除后班级信息:
\n");
listdisplay(stu_info);
printf("删除已经完成,按任意键继续……\n");
getch();
system("cls");
break;
case4:
listdisplay(stu_info);
printf("显示结果如上所示,按任意键继续……\n");
getch();
system("cls");
break;
case5:
return;
}
}
}
(二)提高篇
利用单链表完成一个班级学生课程成绩的简单管理
#defineNULL0
#include
#include
#include
typedefstructstu
{
intnum;//学生的学号
charname[10]; //学生的姓名
floatscore;//学生的成绩
}STUDENT;//存放单个学生信息的结构体类型
typedefstructnode
{
STUDENTdata;//结点的值
structnode*next;//指向下一个结点的地址
}SNODE;
voidshowmenu()
{//显示菜单
printf("欢迎使用成绩管理小软件\n");
printf("\t1、创建学生信息\n");
printf("\t2、插入学生信息\n");
printf("\t3、删除学生信息\n");
printf("\t4、显示学生信息\n");
printf("\t5、退出程序\n");
}
SNODE*listcreate(SNODE*head,intn)//n为该班级的实际人数
{//建立班级学生信息
inti;
SNODE*p=NULL,*q=NULL;
p=head;
for(i=1;i<=n;i++)//循环插入n个学生
{
printf("\n请输入第%d位学生的信息:
\n",i);
q=(SNODE*)malloc(sizeof(SNODE));
printf("学号=");scanf("%d",&q->data.num);
printf("姓名=");scanf("%s",q->data.name);
printf("成绩=");scanf("%f",&q->data.score);
q->next=NULL;
p->next=q;
p=q;
head->data.num++;
}
returnhead;
}
SNODE*listinsert(SNODE*head,inti)//将学生插入到班级Li_head的第i个位置。
{
}
SNODE*listdel(SNODE*head,inti)
//删除链表Li_head中第i个学生的信息
{
}
voidlistdisplay(SNODE*head)
{
//显示所有学生信息
SNODE*p;
p=head->next;
printf("班级学生信息如下:
\n");
printf("学号姓名成绩\n");
while(p!
=NULL)
{
printf("%10d%10s%10.2f\n",p->data.num,p->data.name,p->data.score);
p=p->next;
}
}
voidmain()
{
SNODE*head=NULL;
intno,stu_count,pos;
head=(SNODE*)malloc(sizeof(SNODE));//动态建立第一个结点,作为头结点,head指针指向它,
head->data.num=0;//链表为带头结点的单链表
head->next=NULL;
while
(1)
{
showmenu();
printf("请输入你的选择:
");
scanf("%d",&no);
switch(no)
{
case1:
printf("班级信息初始化,按任意键继续……\n");
getch();
printf("请输入班级学生原始人数:
");
scanf("%d",&stu_count);
head=listcreate(head,stu_count);
system("cls");
showmenu();
listdisplay(head);
printf("班级信息初始化已经完成,按任意键继续……\n");
getch();
system("cls");
break;
case2:
printf("插入前班级信息:
\n");
listdisplay(head);
printf("请输入插入位置:
");
scanf("%d",&pos);
head=listinsert(head,pos);
printf("插入后班级信息:
\n");
listdisplay(head);
printf("插入已经完成,按任意键继续……\n");
getch();
system("cls");
break;
case3:
printf("删除前班级信息:
\n");
listdisplay(head);
printf("请输入删除位置:
");
scanf("%d",&pos);
head=listdel(head,pos);
printf("删除后班级信息:
\n");
listdisplay(head);
printf("删除已经完成,按任意键继续……\n");
getch();
system("cls");
break;
case4:
listdisplay(head);
printf("显示结果如上所示,按任意键继续……\n");
getch();
system("cls");
break;
case5:
return;
}
}
}
(三)挑战篇(任意选做一题)
1、设LA和LB是两个有序的单链表,Pa和Pb分别指向两个表的表头结点,试编写一个算法将这两个表归并为一个有序的单链表。
2、整数集合A和集合B中各有若干个元素,请编程实现集合A与集合B的相关运算,包括交集、并集、补集和差集等。
提示:
集合A和集合B采用单链表来表示,各种集合运算的结果也是链表。
【思考问题】
1.线性表的顺序存储和链表存储的差异?
优缺点分析?
2.那些操作引发了数据的移动?
3.算法的时间效率是如何体现的?
4.链表的指针是如何后移的?
如何加强程序的健壮性?
【实验小结】(总结本次实验的重难点及心得、体会、收获)
得分_____________
评阅日期_____________
教师签名____________
实验二堆栈和队列基本操作的编程实现
【实验目的】
堆栈和队列基本操作的编程实现
要求:
堆栈和队列基本操作的编程实现(2学时,验证型),掌握堆栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。
也鼓励学生利用基本操作进行一些应用的程序设计。
【实验性质】
验证性实验(学时数:
2H)
【实验内容】
内容:
把堆栈和队列的顺序存储(环队)和链表存储的数据进队、出队等运算其中一部分进行程序实现。
可以实验一的结果自己实现数据输入、数据显示的函数。
利用基本功能实现各类应用,如括号匹配、回文判断、事物排队模拟、数据逆序生成、多进制转换等。
【参考代码】(以下内容,学生任意选择一个完成即可)
(一)基础篇
利用顺序栈实现十进制整数转换转换成r进制
1、算法思想
将十进制数N转换为r进制的数,其转换方法利用辗转相除法,以N=3456,r=8为例转换方法如下:
NN/8(整除)N%8(求余)
34564320低
432540
5466
606高
所以:
(3456)10=(6600)8
我们看到所转换的8进制数按底位到高位的顺序产生的,而通常的输出是从高位到低位的,恰好与计算过程相反,因此转换过程中每得到一位8进制数则进栈保存,转换完毕后依次出栈则正好是转换结果。
算法思想如下:
当N>0时重复1,2
①若N≠0,则将N%r压入栈s中,执行2;若N=0,将栈s的内容依次出栈,算法结束。
②用N/r代替N
2、转换程序
#include
#include
#include
#defineMAXSIZE100//根据需要自己定义MAXSIZE为顺序栈的最大存储容量
typedefstructstack
{
intdata[MAXSIZE];
inttop;
}SEQSTACK;
voidinitstack(SEQSTACK*s)//顺序栈初始化
{
;//将栈顶指针指向初始的位置
}
intempty(SEQSTACK*s)//判断栈空
{
if(s->top==-1)
return1;
else
return0;
}
voidpush(SEQSTACK*s,intx)//元素x进栈
{
if(s->top==MAXSIZE-1)
printf("存储空间已满,元素进栈失败!
\n");
else
{
;//栈顶指针加1
;//将元素x送到栈顶位置
}
}
intpop(SEQSTACK*s)//元素出栈,出栈元素用e返回
{
inte;
if(empty(s)==-1)
{
printf("栈中元素已空,出栈元素失败!
\n");
return-99;
}
else
{
;//将栈顶元素赋值给变量e
;//栈顶指针减1
returne;
}
}
voidconversion(SEQSTACK*s,intN,intr)
{//将十进制数N转换为r进制的数
intx;
initstack(s);
while(N!
=0)//此循环为入栈操作
{
;//将N除以r所得的余数压入栈
;//N整除r所得的商赋值给N
}
while(!
empty(s))//此循环为出栈操作
{
x=pop(s);
if(x==10)printf("A");
elseif(x==11)printf("B");
elseif(x==12)printf("C");
elseif(x==13)printf("D");
elseif(x==14)printf("E");
elseif(x==15)printf("F");
elseprintf("%d",x);
}
printf("\n");
}
voidmain()
{
intnumber,r;//number为待准备转换的十进制数,r为进制
SEQSTACKstack;
charchoice;
while
(1)
{
printf("请输入一个十进制整数:
");
scanf("%d",&number);
printf("选择将该数转换为几进制数(2,8,16):
");
scanf("%d",&r);
fflush(stdin);
printf("转换后的结果为:
");
conversion(&stack,number,r);
printf("是否继续?
按N结束,其他任意键继续…");
scanf("%c",&choice);
system("cls");
if(choice=='N'||choice=='n')
break;
}
}
(二)提高篇
//链队列基本操作
//根据实际处理数据的类型定义链队中结点的值域类型elemtype
#include
#include
#include
typedefintelemtype;
typedefstructnode//队列结点类型定义
{elemtypedata;//队列的数据元素类型
structnode*next;//指向后继结点的指针
}NODE;
typedefstruct
{//定义链队
NODE*front,*rear;//定义链队队头和队尾指针
}LINKQUEUE;
voidinitqueue(LINKQUEUE*QL)//队列的初始化
{
QL->front=(NODE*)malloc(sizeof(NODE));//队列为带头结点的链队列
QL->front->next=NULL;
QL->rear=QL->front;
}
LINKQUEUE*pushqueue(LINKQUEUE*QL,elemtypex)
{//将元素x插入到链队列QL中,作为QL的新队尾
}
elemtypepopqueue(LINKQUEUE*QL)
{//若链队列不为空,则删除队头元素,返回其元素值
}
voidprintqueue(LINKQUEUE*QL)//队列的显示
{
NODE*p;
p=QL->front->next;
if(p==NULL)
printf("队列空!
");
while(p!
=NULL)
{
if(p->next==NULL)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构B 数据结构 实验 指导书