《数据结构B》实验指导书Word文档下载推荐.docx

上传人:b****8 文档编号:22896094 上传时间:2023-02-05 格式:DOCX 页数:94 大小:91.84KB
下载 相关 举报
《数据结构B》实验指导书Word文档下载推荐.docx_第1页
第1页 / 共94页
《数据结构B》实验指导书Word文档下载推荐.docx_第2页
第2页 / 共94页
《数据结构B》实验指导书Word文档下载推荐.docx_第3页
第3页 / 共94页
《数据结构B》实验指导书Word文档下载推荐.docx_第4页
第4页 / 共94页
《数据结构B》实验指导书Word文档下载推荐.docx_第5页
第5页 / 共94页
点击查看更多>>
下载资源
资源描述

《数据结构B》实验指导书Word文档下载推荐.docx

《《数据结构B》实验指导书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《数据结构B》实验指导书Word文档下载推荐.docx(94页珍藏版)》请在冰豆网上搜索。

《数据结构B》实验指导书Word文档下载推荐.docx

【注意事项】

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)

print

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1