版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.../数据结构课程设计报告班级:姓名:学号:目录设计任务3设计时间3设计内容31、需要分析32、概要设计33、详细设计44、测试与分析9四、设计总结10源程序清单11一.设计任务:我选课程设计是自选题目《图的遍历》。要求:设计一个程序,实现图的广度,深度优先遍历。二、设计时间2009三、设计内容1、需求分析本题目需要解决的问题是将一幅已知图,对图进行遍历,并完成:〔1输出它的邻接矩阵;〔2根据人工选择进行深度优先搜索〔Depth_FirstSearch和广度优先搜索〔Breadth_FirstSearch,将搜索结果放入一队列中;〔3将队列中的搜索结果输出。2、概要设计:<1>抽象数据的类型定义数据对象:V是图具有相同特性的数据元素的集合,称为定顶点集数据关系:RR={VR}VR={<v,w>/v,w∈v且p<v,w>}基本操作:CreateGraph<&G,V,VR>初始条件:V是图的顶点集,VR是图中弧的集合操作结果:按V和VR的定义构造图G基本操作:DFSTraverse<G,Visit<>>BFSTraverse<G,Visit<>>〔2主程序的流程以及各程序模块之间的调用关系:CreateGraph算法CreateGraph算法打印邻接矩阵初始化成功选择如何遍历开始深度优先遍历广度优先遍历结束NYDB3、详细设计:〔1定义图
typedef
struct{
intV[M];
intR[M][M];
intvexnum;
}Graph;〔2创建图
voidcreatgraph<Graph*g,intn>
{
inti,j,r1,r2;
g->vexnum=n;
/*顶点用i表示*/
for<i=1;i<=n;i++>
{
g->V[i]=i;
}
/*初始化R*/
for<i=1;i<=n;i++>
for<j=1;j<=n;j++>
{
g->R[i][j]=0;
}
/*输入R*/
printf<"PleaseinputR<0,0END>:\n">;
scanf<"%d,%d",&r1,&r2>;
while<r1!=0&&r2!=0>
{
g->R[r1][r2]=1;
g->R[r2][r1]=1;
scanf<"%d,%d",&r1,&r2>;
}
}〔3全局变量:访问标志数组
voidprintgraph<Graph*g>
{
inti,j;
for<i=1;i<=g->vexnum;i++>
{for<j=1;j<=g->vexnum;j++>
{
printf<"%2d",g->R[i][j]>;
}
printf<"\n">;
}
}
〔4访问顶点
intvisited[M];
voidvisitvex<Graph*g,intvex>
{printf<"%d",g->V[vex]>;
}〔5获取第一个未被访问的邻接节点
intfirstadjvex<Graph*g,intvex>
{
intw,i;
for<i=1;i<=g->vexnum;i++>
{
if<g->R[vex][i]==1&&visited[i]==0>
{
w=i;
break;
}
else
{
w=0;
}
}
returnw;
}
/*获取下一个未被访问的邻接节点<深度遍历>*/
intnextadjvex<Graph*g,intvex,intw>
{
intt;
t=firstadjvex<g,w>;
returnt;
}
〔6深度递归遍历
voiddfs<Graph*g,int
vex>
{
int
w;
visited[vex]=1;
visitvex<g,vex>;
for<w=firstadjvex<g,vex>;w>0;w=nextadjvex<g,vex,w>>
if<!visited[w]>
{
dfs<g,w>;
}
}void
dfstraverse<Graph*g>
{
inti;
for<i=1;i<=g->vexnum;i++>
visited[i]=0;
for<i=1;i<=g->vexnum;i++>
if<!visited[i]>
{dfs<g,i>;}
}
〔7定义队列
typedef
struct{
intV[M];
intfront;
intrear;
}Queue;
〔8初始化队列
initqueue<Queue
*q>
{
q->front=0;
q->rear=0;
}
〔9判断队列是否为空
intquempty<Queue*q>
{
if<q->front==q->rear>
{
return0;
}
else
{
return1;
}
}
〔10入队操作
enqueue<Queue*q,inte>
{
if<<q->rear+1>%M==q->front>
{
printf<"The
queueisoverflow!\n">;
return0;
}
else
{
q->V[q->rear]=e;
q->rear=<q->rear+1>%M;
return1;
}
}
〔11出队操作
dequeue<Queue*q>
{
intt;
if<q->front==q->rear>
{
printf<"Thequeueisempty!\n">;
return0;
}
else
{
t=q->V[q->front];
q->front=<q->front+1>%M;
returnt;
}
}
〔12广度遍历
voidBESTraverse<Graph*g>
{
inti;
Queue
*q=<Queue*>malloc<sizeof<Queue>>;
for<i=1;i<=g->vexnum;i++>
{
visited[i]=0;
}
initqueue<q>;
for<i=1;i<=g->vexnum;i++>
{
if<!visited[i]>
{
visited[i]=1;
visitvex<g,g->V[i]>;
enqueue<q,g->V[i]>;
while<!quempty<q>>
{
intu,w;
u=dequeue<q>;
for<w=firstadjvex<g,u>;w>0;w=nextadjvex<g,u,w>>
{
if<!visited[w]>
{
visited[w]=1;
visitvex<g,w>;
enqueue<q,w>;
}
}
}
}
}
}4、测试与分析:针对下图进行测试和分析:112345678由图已知有8个结点,根据提示"Pleaseinputthenumberofvertex:"输入"8"。再根据图输入邻接矩阵中有关系的两点,两点有关系只要输入一次即可。当输入完所有关系后输入"0,0"再输入回车,程序将输出该图邻接矩阵。再根据提示选择"b","d"或"q"。选"b"表示广度优先搜索〔Breadth_FirstSearch,"d"表示深度优先搜索〔Depth_FirstSearch,"q"表示退出。Pleaseinputthenumberthenumberofvertex:8PleaseinputR<0,0END>:1,22,44,85,82,51,33,63,70,0Thisisthelinjiejuzhenofgraph:0110000010011000100001100100000101000001001000000010000000011000Pleaseinputbordorq,Breadth_first:bDepth_first:dquit:qbBreadth_first:12345678Pleaseinputbordorq,Breadth_first:bDepth_first:dquit:qdDepth_fitst:12485367Pleaseinputbordorq,Breadth_first:bDepth_first:dquit:qqPressanykeytocontine运行结果正确此程序可用四、设计总结:图的遍历是程序设计语言编译中的一个最基本问题。"图的遍历"是数据结构中主要的内容之一,也是重要的内容之一。它是树的遍历的拓展,但要比树的遍历复杂得多,是排序等的基础。它运用了深度优先遍历,广度优先遍历,入队,出队等多种运算,很有意义,是对数据结构一些基本操作的综合应用。在做设计的开始就遇到了很多困难,比如,如何才能构造邻接矩阵,如何将邻接矩阵表示出来,如何将结果输出,以及深度优先搜索和广度优先搜索的用C语言表达等。在仔细研究教材寻找资料后,并和同学一同探讨最终将困难解决。本次课程设计是学习数据结构后的一次具体的实践,体现了理论与实践的有效结合。在实践中体现出理论的思想,在实践中深入了解理论的具体实质,在实践中明白理论的精髓所在。同样也很好地锻炼了我自己动手动脑的的能力!附录:源程序清单#define
M20
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef
struct{
intV[M];
intR[M][M];
intvexnum;
}Graph;voidcreatgraph<Graph*g,intn>
{
inti,j,r1,r2;
g->vexnum=n;
/*顶点用i表示*/
for<i=1;i<=n;i++>
{
g->V[i]=i;
}
for<i=1;i<=n;i++>
for<j=1;j<=n;j++>
{
g->R[i][j]=0;
}
printf<"PleaseinputR<0,0END>:\n">;
scanf<"%d,%d",&r1,&r2>;
while<r1!=0&&r2!=0>
{
g->R[r1][r2]=1;
g->R[r2][r1]=1;
scanf<"%d,%d",&r1,&r2>;
}
}
voidprintgraph<Graph*g>
{
inti,j;
for<i=1;i<=g->vexnum;i++>
{for<j=1;j<=g->vexnum;j++>
{
printf<"%2d",g->R[i][j]>;
}
printf<"\n">;
}
}
intvisited[M];
voidvisitvex<Graph*g,intvex>
{
printf<"%d",g->V[vex]>;
}
intfirstadjvex<Graph*g,intvex>
{
intw,i;
for<i=1;i<=g->vexnum;i++>
{
if<g->R[vex][i]==1&&visited[i]==0>
{
w=i;
break;
}
else
{
w=0;
}
}
returnw;
}
intnextadjvex<Graph*g,intvex,intw>
{
intt;
t=firstadjvex<g,w>;
returnt;
}
voiddfs<Graph*g,int
vex>
{
int
w;
visited[vex]=1;
visitvex<g,vex>;
for<w=firstadjvex<g,vex>;w>0;w=nextadjvex<g,vex,w>>
if<!visited[w]>
{
dfs<g,w>;
}
}void
dfstraverse<Graph*g>
{
inti;
for<i=1;i<=g->vexnum;i++>
visited[i]=0;
for<i=1;i<=g->vexnum;i++>
if<!visited[i]>
{dfs<g,i>;}
}
typedef
struct{
intV[M];
intfront;
intrear;
}Queue;
initqueue<Queue
*q>
{
q->front=0;
q->rear=0;
}
intquempty<Queue*q>
{
if<q->front==q->rear>
{
return0;
}
else
{
return1;
}
}
enqueue<Queue*q,inte>
{
if<<q->rear+1>%M==q->front>
{
printf<"The
queueisoverflow!\n">;
return0;
}
else
{
q->V[q->rear]=e;
q->rear=<q->rear+1>%M;
return1;
}
}
dequeue<Queue*q>
{
intt;
if<q->front==q->rear>
{
printf<"Thequeueisempty!\n">;
return0;
}
else
{
t=q->V[q->front];
q->front=<q->front+1>%M;
returnt;
}
}
voidBESTraverse<Graph*g>
{
inti;
Queue
*q=<Queue*>malloc<sizeof<Queue>>;
for<i=1;i<=g->vexnum;i++>
{
visited[i]=0;
}
initqueue<q>;
for<i=1;i<=g->vexnum;i++>
{
if<!visited[i]>
{
visited[i]=1;
visitvex<g,g->V[i]>;
enqueue<q,g->V[i]>;
while<!quempty<q>>
{
intu,w;
u=dequeue<q>;
for<w=firstadjvex<g,u>;w>0;w=nextadjvex<g,u,w>>
{
if<!visited[w]>
{
visited[w]=1;
visitvex<g,w>;
en
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026恒安标准人寿保险有限公司天津分公司招聘笔试参考题库及答案详解
- 2026陕西西安国际港务区新筑社区医院招聘39人笔试参考题库及答案详解
- 投资决策2026年投资咨询服务协议
- 商业伦理培训服务协议2026年版
- 线上心理咨询兼职合同2026版
- 内容审核与发布协议2026执行
- 市场定位与市场细分合作协议
- 2026江西吉安市泰和县新睿人力资源服务有限公司面向社会招聘项目制人员1人笔试模拟试题及答案详解
- 宁银消金2027届暑期实习生招募笔试备考试题及答案详解
- 2026陕西西安市第一医院康复医学科招聘医师3名笔试备考试题及答案详解
- 2026年宁波余姚市泗门镇人民政府公开招聘编外工作人员7人笔试参考试题及答案解析
- (2026年)检验检测机构资质认定“一单一库”的学习与解读(2026年实施)课件
- 24J113-1 内隔墙-轻质条板(一)
- GB/T 44906-2024生物质锅炉技术规范
- 鞍区占位术后护理
- 脊髓损伤的并发症及预防
- 2024年贵州省中考理科综合试卷(含答案解析)
- 唐诗宋词人文解读智慧树知到期末考试答案章节答案2024年上海交通大学
- (高清版)WST 311-2023 医院隔离技术标准
- 初中地理(中考)会考模拟试题(五)
- 大班数学活动《10的分与合》课件
评论
0/150
提交评论