《数据结构B》实验指导书Word文档下载推荐.docx
- 文档编号:22896094
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:94
- 大小:91.84KB
《数据结构B》实验指导书Word文档下载推荐.docx
《《数据结构B》实验指导书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《数据结构B》实验指导书Word文档下载推荐.docx(94页珍藏版)》请在冰豆网上搜索。
【注意事项】
1.开发语言:
使用C。
2.可以自己增加其他功能。
【参考代码】
(以下内容,学生任意选择一个完成即可)
(一)基础篇
//利用顺序表完成一个班级学生课程成绩的简单管理
#include<
stdio.h>
stdlib.h>
conio.h>
#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);
学号="
);
scanf("
%d"
&
Li->
stu[i].num);
//输入第i个学生的学号
姓名="
%s"
stu[i].name);
//输入第i个学生的姓名
成绩="
%f"
stu[i].score);
//输入第i个学生的成绩
Li->
length++;
//学生人数加1
}
}
intlistinsert(LIST*Li,inti)
//将学生插入到班级Li的第i个位置。
//插入一个学生信息
intj;
STUDENTe;
if(Li->
length>
=MAXSIZE-1)
//测试存储空间是否被占满
无更多的存储空间!
return0;
}
if(i<
=0||i>
=Li->
length+2)
//插入位置检验,如果错误就返回0退出程序。
printf("
插入位置有误!
return0;
else
请输入插入的学生信息:
scanf("
e.num);
e.name);
e.score);
;
//利用for循环将第i个及其后面的元素依次往后移动
//移开位置后将学生e放入到i位置
//完成插入后,学生实际人数加1
return1;
}
intlistdel(LIST*Li,inti)
//删除一个学生信息
//删除第i个学生的信息
length)//删除位置检验,如果错误就返回0退出程序。
;
//利用for循环将准备删除的第i个及其后面的元素依次往前移动
//删除第i个学生后,学生人数减1
voidlistdisplay(LISTL)
{//显示所有学生信息
//printf("
班级学生信息如下:
printf("
学号姓名成绩\n"
=L.length;
i++)
%10d%10s%10.2f\n"
L.stu[i].num,L.stu[i].name,L.stu[i].score);
voidshowmenu()
{//显示菜单
欢迎使用成绩管理小软件\n"
\t1、创建学生信息\n"
\t2、插入学生信息\n"
\t3、删除学生信息\n"
\t4、显示学生信息\n"
\t5、退出程序\n"
voidmain()
intno,stu_count,pos;
LISTstu_info;
while
(1)
showmenu();
请输入你的选择:
"
no);
switch(no)
{
case1:
班级信息初始化,按任意键继续……\n"
getch();
请输入班级学生原始人数:
scanf("
stu_count);
listcreate(&
stu_info,stu_count);
system("
cls"
showmenu();
listdisplay(stu_info);
printf("
班级信息初始化已经完成,按任意键继续……\n"
getch();
system("
break;
case2:
printf("
插入前班级信息:
listdisplay(stu_info);
请输入插入位置:
scanf("
pos);
listinsert(&
stu_info,pos);
插入后班级信息:
插入已经完成,按任意键继续……\n"
getch();
system("
break;
case3:
删除前班级信息:
请输入删除位置:
listdel(&
删除后班级信息:
删除已经完成,按任意键继续……\n"
case4:
listdisplay(stu_info);
显示结果如上所示,按任意键继续……\n"
case5:
return;
(二)提高篇
利用单链表完成一个班级学生课程成绩的简单管理
#defineNULL0
//学生的学号
//学生的姓名
//学生的成绩
}STUDENT;
//存放单个学生信息的结构体类型
typedefstructnode
{
STUDENTdata;
//结点的值
structnode*next;
//指向下一个结点的地址
}SNODE;
SNODE*listcreate(SNODE*head,intn)//n为该班级的实际人数
{//建立班级学生信息
SNODE*p=NULL,*q=NULL;
p=head;
=n;
i++)//循环插入n个学生
\n请输入第%d位学生的信息:
q=(SNODE*)malloc(sizeof(SNODE));
scanf("
q->
data.num);
q->
data.name);
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;
while(p!
=NULL)
p->
data.num,p->
data.name,p->
p=p->
voidmain()
SNODE*head=NULL;
head=(SNODE*)malloc(sizeof(SNODE));
//动态建立第一个结点,作为头结点,head指针指向它,
head->
data.num=0;
//链表为带头结点的单链表
head->
head=listcreate(head,stu_count);
listdisplay(head);
listdisplay(head);
head=listinsert(head,pos);
head=listdel(head,pos);
listdisplay(head);
}
(三)挑战篇(任意选做一题)
1、设LA和LB是两个有序的单链表,Pa和Pb分别指向两个表的表头结点,试编写一个算法将这两个表归并为一个有序的单链表。
2、整数集合A和集合B中各有若干个元素,请编程实现集合A与集合B的相关运算,包括交集、并集、补集和差集等。
提示:
集合A和集合B采用单链表来表示,各种集合运算的结果也是链表。
【思考问题】
1.线性表的顺序存储和链表存储的差异?
优缺点分析?
2.那些操作引发了数据的移动?
3.算法的时间效率是如何体现的?
4.链表的指针是如何后移的?
如何加强程序的健壮性?
【实验小结】(总结本次实验的重难点及心得、体会、收获)
得分_____________
评阅日期_____________
教师签名____________
实验二堆栈和队列基本操作的编程实现
堆栈和队列基本操作的编程实现
堆栈和队列基本操作的编程实现(2学时,验证型),掌握堆栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。
也鼓励学生利用基本操作进行一些应用的程序设计。
内容:
把堆栈和队列的顺序存储(环队)和链表存储的数据进队、出队等运算其中一部分进行程序实现。
可以实验一的结果自己实现数据输入、数据显示的函数。
利用基本功能实现各类应用,如括号匹配、回文判断、事物排队模拟、数据逆序生成、多进制转换等。
利用顺序栈实现十进制整数转换转换成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、转换程序
#defineMAXSIZE100//根据需要自己定义MAXSIZE为顺序栈的最大存储容量
typedefstructstack
intdata[MAXSIZE];
inttop;
}SEQSTACK;
voidinitstack(SEQSTACK*s)//顺序栈初始化
;
//将栈顶指针指向初始的位置
intempty(SEQSTACK*s)//判断栈空
if(s->
top==-1)
else
voidpush(SEQSTACK*s,intx)//元素x进栈
top==MAXSIZE-1)
存储空间已满,元素进栈失败!
;
//栈顶指针加1
//将元素x送到栈顶位置
}
intpop(SEQSTACK*s)//元素出栈,出栈元素用e返回
inte;
if(empty(s)==-1)
栈中元素已空,出栈元素失败!
return-99;
//将栈顶元素赋值给变量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("
x);
intnumber,r;
//number为待准备转换的十进制数,r为进制
SEQSTACKstack;
charchoice;
while
(1)
请输入一个十进制整数:
number);
选择将该数转换为几进制数(2,8,16):
r);
fflush(stdin);
转换后的结果为:
conversion(&
stack,number,r);
是否继续?
按N结束,其他任意键继续…"
%c"
choice);
system("
if(choice=='
N'
||choice=='
n'
//链队列基本操作
//根据实际处理数据的类型定义链队中结点的值域类型elemtype
typedefintelemtype;
typedefstructnode//队列结点类型定义
{elemtypedata;
//队列的数据元素类型
structnode*next;
//指向后继结点的指针
}NODE;
typedefstruct
{//定义链队
NODE*front,*rear;
//定义链队队头和队尾指针
}LINKQUEUE;
voidinitqueue(LINKQUEUE*QL)//队列的初始化
QL->
front=(NODE*)malloc(sizeof(NODE));
//队列为带头结点的链队列
front->
rear=QL->
front;
LINKQUEUE*pushqueue(LINKQUEUE*QL,elemtypex)
{//将元素x插入到链队列QL中,作为QL的新队尾
elemtypepopqueue(LINKQUEUE*QL)
{//若链队列不为空,则删除队头元素,返回其元素值
voidprintqueue(LINKQUEUE*QL)//队列的显示
NODE*p;
p=QL->
if(p==NULL)
队列空!
if(p->
next==NULL)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构B 数据结构 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)