数据结构实验报告汇总文档格式.docx
- 文档编号:21567157
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:28
- 大小:98.89KB
数据结构实验报告汇总文档格式.docx
《数据结构实验报告汇总文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告汇总文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
{
p->
next=i;
next=newNode;
p=p->
next;
}
data=n;
next=Head;
while(p!
=Head)//关键部分,通过判断输出出列顺序
for(intj=1;
j<
m;
j++)
p=Head;
Head=Head->
j=j-3;
next=Head->
cout<
<
Head->
data<
"
"
;
deleteHead;
Head=p->
p->
data;
}
voidmain()//主函数
输出次序:
CreateList(8,4);
顺序结构:
#definen8
#definem4
voidget()
inta[n],j=0,k=0;
for(inti=0;
i++)//创建数组
a[i]=i+1;
for(i=0;
i++)//关键部分,通过判断输出出列顺序
if(a[i]!
=0)
j++;
if(j==m)
a[i]<
j=0;
k++;
a[i]=0;
if(k==n)
break;
if(i==n-1)
i=-1;
get();
5、实验结果
输出次序:
48521376
6、实验总结
通过这次实验我学会了如何用程序来解决约瑟夫的问题,对单循环链表以及顺序存储结构有了进一步的认识;
实验二停车场管理
一、实验目的及要求
问题描述:
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场按车辆到达时的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若停车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则便道上的第一辆车即可开入。
当停车场内某辆汽车要离开时,由于停车场是狭长通道,在它之后开入车场必须先退出车场为它让路,待该车辆开出大门外后,为它让路的车辆再按原次序进入车场。
在这里假设汽车不能从便道上开走。
每辆车停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
要求:
根据各结点的信息,调用相应的函数或者语句,将结点入栈或入队,出栈或出队。
首先本程序包含一个临时栈s2,一个停车场栈s1,及一个队列便道q,栈采用顺序存储结构,队列采用链式存储结构。
车辆进栈就是将元素插进s1,栈满了的话元素就会插进队列中,如果有栈底的元素要离开的话,这就需要用到临时栈了,将该元素上面的元素依放入临时栈中,等要离开的元素离开后在放回来;
然后s1未满且q中仍有元素时,q中最前面的元素就插进s1中,这样就基本实现了实验目的;
constintN=3;
typedefstruct//将结构体类型化方便添加其他相关信息,比如车辆到达时间(只需增加intarrivetime)
{
intnum;
}elemtype;
structseqstack//栈类型,s1为停车场,s2为临时栈
elemtypestack[N+1];
inttop;
}s1,s2;
structlink//节点类型,包含含车辆信息的数据域和一个指针域
elemtypedata;
link*next;
};
structlinkqueue//队列类型,包含头指针与尾指针
link*f,*r;
}q;
seqstackini(seqstackS)//初始化栈
S.top=0;
returnS;
seqstackpush(seqstackS,elemtypex)//进栈
if(S.top<
=5)S.top++;
S.stack[S.top]=x;
seqstackpop(seqstackS)//弹出栈顶元素
S.top--;
returnS;
elemtypegettop(seqstackS)//获取栈顶元素
returnS.stack[S.top];
intempty(seqstackS)//判栈空
if(S.top==0)return1;
elsereturn0;
linkqueueiniq(linkqueues)//初始化队列
link*p;
p=newlink;
next=NULL;
s.f=s.r=p;
returns;
linkqueueenqueue(linkqueues,elemtypex)//元素入队
data=x;
next=s.r->
s.r->
next=p;
s.r=p;
linkqueuedlqueue(linkqueues)//元素出队
link*p=s.f;
s.f=p->
deletep;
elemtypegethead(linkqueues)//取队头元素
returns.f->
next->
}
intemptyq(linkqueues)//判队空
if(s.f==s.r)return1;
voidarrive(elemtypex)//处理车辆到达时的情况
if(s1.top==N)
q=enqueue(q,x);
elses1=push(s1,x);
voiddelive(elemtypex)//处理有车辆离开时的情况
intb=1;
elemtypey;
link*m;
while((!
empty(s1))&
&
(b==1))
if(s1.stack[s1.top].num!
=x.num)
{
y=gettop(s1);
s1=pop(s1);
s2=push(s2,y);
}
else
b=0;
cout<
停车场中有编号为"
x.num<
的车,该车将离开"
endl;
while(!
empty(s2))
{
y=gettop(s2);
s1=push(s1,y);
s2=pop(s2);
}
if(!
emptyq(q))
y=gethead(q);
q=dlqueue(q);
if(empty(s1))
while(!
y=gettop(s2);
s1=push(s1,y);
s2=pop(s2);
if(!
link*p=q.f;
while((p!
=NULL)&
(p->
data.num!
=x.num))
m=p;
p=p->
if(p!
=NULL)
cout<
便道上有编号为"
m->
next=p->
deletep;
elsecout<
停车场和便道上都没有编号为"
的车辆,请再次检查"
voidpr1()//输出停车场中的车辆编号
intt=s1.top;
停车场中的车辆:
while(t!
=0)
cout<
s1.stack[t].num<
t--;
voidpr2()//输出便道上的车辆编号
link*p=q.f->
便道中得到车辆:
=NULL){cout<
data.num<
voidmain()
intn;
elemtypex;
s1=ini(s1);
s2=ini(s2);
q=iniq(q);
while
(1)
请输入进来的车辆编号(一次只能进一辆):
cin>
>
x.num;
请输入要作处理的代号(1到达2离开3结束)"
if(n==1){arrive(x);
pr1();
pr2();
elseif(n==2){delive(x);
elsebreak;
通过本次实验我对栈以及队列有了进一步的了解,熟练了栈和队列的性质原理以及它们的应用。
实验三对二叉树进行遍历
1、实验目的
建立一棵二叉树,并分别用前序、中序、后序遍历该二叉树;
结点形式:
LchilddataRchild
输入数据1,2,3,0,0,4,5,0,0,6,7,0,0,0,8,9,0,0,10,11,12,0,0,13,0,0,14,0,0,其中“0”表示空子树。
设计二叉树结构体bitreptr,建立二叉树,用递归算法按照前序、中序、后序的遍历原则对其进行遍历;
structbitreptr
bitreptr*Lchild,*Rchild;
voidcreatbtr(bitreptr*&
t)//建立二叉树
intx;
cin>
x;
if(x==0)
t=NULL;
else
t=newbitreptr;
t->
creatbtr(t->
Lchild);
Rchild);
voidPreorder(bitreptr*t)//先序遍历
if(t)
t->
Preorder(t->
voidIndorder(bitreptr*t)//中序遍历
Indorder(t->
voidPostorder(bitreptr*t)//后序遍历
Postorder(t->
按先序输入,虚节点为0"
bitreptr*t=NULL;
creatbtr(t);
先序:
Preorder(t);
中序:
Indorder(t);
后序:
Postorder(t);
通过本次实验我对二叉树的三种遍历原则有了进一步的了解,并学会了如何建立二叉树以及遍历它们;
实验四图的遍历
用邻接表建立一个图,并分别按照广度优先和深度优先搜索算法遍历图中的每个顶点;
说明:
(1)存储结构采用邻接表结构;
(2)分别采用深度优先和广度优先搜索对图进行遍历;
首先建立一个邻接表创建图,通过输入顶点对创建图的样子,顶点对的顺序决定了图的遍历结果,然后用递归算法根据广度遍历原则和深度遍历原则遍历图;
主函数直接调用dfs和bfs即可;
#defineVnum100
intvisited1[Vnum];
intvisited2[Vnum];
typedefstructedgenode
intadjvex;
structedgenode*next;
}Edgeptr;
typedefstruct
intvertex;
Edgeptr*link;
}vexnode;
typedefvexnodeAdjList[Vnum];
AdjListga;
intn,e;
voidbuild_adjlist(AdjList&
ga)//邻接表的建立
请输入顶点数和边数:
n>
e;
i++)
ga[i].vertex=i;
ga[i].link=NULL;
for(intk=0;
k<
k++)
Edgeptr*p;
inti,j;
请输入顶点对:
i>
j;
p=newstructedgenode;
adjvex=j;
next=ga[i].link;
ga[i].link=p;
adjvex=i;
next=ga[j].link;
ga[j].link=p;
voiddfs(AdjListga,intv0)//深度优先搜索
v0<
visited1[v0]=1;
p=ga[v0].link;
if(visited1[p->
adjvex]==0)
dfs(ga,p->
adjvex);
voidbfs(AdjListga,intv0)//广度优先搜索
intq[Vnum];
visited2[v0]=1;
intf=0,r=0;
intv;
do
v=p->
adjvex;
if(visited2[v]==0)
q[r]=v;
r++;
v<
visited2[v]=1;
if(f!
=r)
v=q[f];
f++;
p=ga[v].link;
}while((p!
=NULL)||(f!
=r));
=n;
if(visited2[j]==0)
bfs(ga,j);
build_adjlist(ga);
深度优先搜索:
dfs(ga,1);
j++)//检查是否访问完了
if(visited1[j]==0)
dfs(ga,j);
广度优先搜索:
bfs(ga,1);
五、实验结果
本次实验基本达到实验要求,实验运行的时候出了点小差错,深度优先搜索的结果一直不对,结果发现是检查是否每个顶点都遍历的一个for循环的判断语句放在了dfs函数里面,导致结果出错,发现后放在主函数里面就好了;
通过这次实验我基本掌握了图的两种遍历方法,以及如何用邻接表建图;
实验五哈希表
1、实验目的及要求
设计哈希表实现电话号码查询系统。
要求实现以下功能:
(1)哈希表中每个记录有下列数据项:
电话号码、用户名、地址;
(2)从键盘输入各记录,以电话号码为关键字建立哈希表(至少要有12个以上的记录,哈希表的长度为8);
(3)采用链地址法解决冲突;
(4)显示建立好的哈希表,并在哈希表上进行查找、删除和插入给定关键字的记录;
(5)采用除留余数法进行哈希表的散列,即以电话号码作为主关键字,将电话号码11位相加,按照模7取余;
首先定义一个Student类存放学生信息,包括name,tel,adress,以及输出信息的函数print;
然后运用除留余数法对哈希表进行散列,hf[12]为存放电话号码的数组,g[key]为哈希函数数组,PrintTable()为输出哈希表的函数,然后就是对哈希表进行查找、删除和插入的函数———SearchTable(),DeleteTable(),InsertTable();
查找函数的思想就是判断输入的关键字是否存在与哈希数组中,定义一个新指针q指向g[key],判断q在电话号码数组hf[]中指向的数据是否等于需要查找的号码,然后输出相应的结果;
删除函数的思想也是先判断是否在哈希数组中已存在,通过指针找到要删除的元素后,将值置空就行了;
插入函数和哈希表的建立是一样的,将信息都插入进去就行了;
之后主函数就是根据相应的功能调用函数即可;
3、源程序
string.h>
#defineM8
classStudent{//学生类存放信息
charname[10];
charadress[20];
public:
chartel[12];
voidgetname()
姓名:
name;
voidgettel()
电话号码:
tel;
while(strlen(tel)!
=11)
号码错误,请重新输入"
cin>
};
voidgetadress()
地址:
adress;
voidprint()
name<
电话号码:
tel<
地址:
adress<
typedefstructedgenode//自定义结构体,做边节点
charhf[12];
Student*ind;
edgenode*next;
}edge;
voidHashTable(edge*g[],Student*st)//建立哈希表
char*p=st->
intkey=0;
while(*p!
='
\0'
)
if((*p>
0'
)&
(*p<
9'
))
key+=(*p-'
);
p++;
key=key%7;
edge*t=newedge;
strcpy(t->
hf,st->
tel);
t->
ind=st;
next=g[key];
g[key]=t;
voidPrintTable(edge*g[])//输出哈希表
输出哈希表:
M;
if(g[i]!
."
edge*q=g[i];
while(q!
q->
hf;
q=q->
voidSearchTable(edge*g[],chara[])//查找
char*p=a;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 汇总