关键词不能为空

当前您在: 主页 > 英语 >

实现图的遍历算法实验报告

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-01 21:48
tags:

-

2021年2月1日发(作者:gunners)


实现图的遍历算法



1




需求分析



对于下图

< br>G



编写一个程序输出从顶点


0


开始的深度优先遍历序列


(非递归算法)


和广度优


先遍历序列(非递归算法)





2




系统设计



1


.用到的抽象数据类型的定义



图的抽象数据类型定义:



ADT


Graph{


数据对象


V



V


是具有相同 特性的数据元素的集合,称为顶点集



数据关系


R












R={VR}










VR={|v,w



V



P(v,w ),


表示从


v


< p>
w


的弧,



谓词


P(v,w)


定义了弧



的意义或信息


}


基本操作


P




CreatGraph(&G,V,VR)


初始条件:


V


是图的顶点集,


VR


是图中弧的集合



操作结果:按


V< /p>



VR


的定义构造图

G


DestroyGraph(&G)


初始条件:图< /p>


G


存在



操作结果:销毁图


G


InsertVex(&G,v)


初始条件:图


G


存在,


v


和图中顶点有相 同特征



操作结果:在图


G

< p>
中增添新顶点


v


……



InsertArc(&G,v,w)


初始条件:图


G


存在,


v



w



G


中两个顶点



操作结果:在


G


中增添弧



,若


G

< p>
是无向的则还增添对称弧



……



DFSTraverse(G,Visit())


初始条件: 图


G


存在,


Visit


是顶点的应用函数



操作结果:


对图进行


深度优先遍历



在遍历过程 中对每个顶点调用函数


Visit


一次且仅一次。


一旦


Visit()


失败,则操作失败



BFSTraverse(G,Visit())


初始条件:图


G


存在,


Visit< /p>


是顶点的应用函数



操作结果:


对图进行


广度优先遍历



在遍历过程中对每个顶点调用函数


Visit


一次且仅一次。


一旦


Visit()


失败,则操作失败



}


ADT


Graph



栈的抽象数据类型定义:



ADT Stack


{


数据对象


< p>
D={ai|ai



ElemSet,i=1,2 ,



,n,n



0}


数据关系



R1={|ai-1,ai



D,i=2,

< br>…


,n}



约定


an


端为栈顶,


ai

< p>
端为栈底



基本操作




InitStack(&S)


操作结果:构造一个空栈


S


DestroyStack(&S)


初始条件:栈

< p>
S


已存在



操作结果:将


S


清为空栈



StackEmpty(S)


初始条件:栈

< br>S


已存在



操作结果:若栈


S


为空栈,则返回


TRUE


,否则


FALSE


……



Push(&S,e)


初始条件:栈


S


已存在



操作结果:插入元素


e


为新的栈顶元素



Pop(&S,&e)


初始条件:栈


S


已存在且非空



操作结果:删除


S


的栈顶元素,并用


e

返回其值



StackTraverse(S,visit())


初始条 件:栈


S


已存在且非空



操作结果:从栈底到栈顶依次对


S


的每个数据元素调 用函数


visit()


,一旦


visi t()


失败,


则操作失效



}


ADT


Stack



队列的抽象数据类型定义:



ADT Queue


{


数据对象



D={a


i


|a


i



ElemSet,i=1,2,< /p>



,n,n



0 }


数据关系



Rl={


i-1


,a


i


>|a< /p>


i-1


,a


i



D,i=2,



,n}



约定其中


a


i


端为队列头,


a


n


端为队列尾。



基本操作




InitQueue(&Q)


操作结果:构造一个空队列


Q


DestroyQueue(&Q)


初始条件:队列


Q


已存在



操作结果: 队列


Q


被销毁,不再存在



QueueEmpty(Q)


初始条件:队列


Q


已存在



操作结果:若


Q


为空队列,则返回


TRUE


,否则


FALSE


……



EnQueue(&Q,e)


初始条件:队列


Q


已存在



操作结果:插入元 素


e



Q


的新 的队尾元素



DeQueue(&Q,&e)


初始条件:


Q


为非空队列


< /p>


操作结果:删除


Q


的队头元素,并用


e


返回其值



}


ADT


Queue



2


.主程序的流程:



调用


CreateDN


函数创建图的邻接表

< p>
G




调用


PrintDN


函数输出邻接表


G

< br>;



调用


DFSTravers e


函数深度优先遍历图;



调用


BFSTraverse


函数广度优先遍历图




3


.函数关系调用图:





LocateVex


main




Visit



FirstAdjVex


CreateDN




NextAdjVex


InitStack



PrintDN



InitQueue



StackEmpty




DFSTraverse


EnQueue


GetTop




QueueEmpty



Push


BFSTraverse




DeQueue


Pop












































主程序




3


.调试分析




1


)书上给出了图的广度优先非递归遍历算法,主要是要实 现里面的


FirstAdjVex(G,u)



NextAdjVex(G,u,w)


函数。我刚开始编写的这两个函数分别为 :



int FirstAdjVex(ALGraph G


,int u){


return LocateVex(G


,G


.vertices[u].firstarc->adj vex);


}



int NextAdjVex(ALGraph G


,int u,int w){


ArcNode *p=es[u].firstarc;


w hile(LocateVex(G


,p->adjvex)!=w)p=p->nex tarc;


p=p->nextarc;


if(!p)return -1;


return LocateVex(G


,p->adjvex);


}


对于书上给出的


BFSTraverse


函 数这样没有问题。但当我仿照


BFSTraverse


函数编出 了


DFSTraverse


函数后就有问题了。经过分析我把以 上两个函数稍作了改动:



int FirstAdjVex(ALGraph G


,int u){

if(!G


.vertices[u].firstarc)return -1;


return LocateVex(G


,G

< br>.vertices[u].firstarc->adjvex);


}



int NextAdjVex(ALGraph G


,int u,int w){


ArcNode *p=es[u].firstarc;


while(p&&LocateVex(G ,p->adjvex)!=w)p=p->nextarc;


if(!p)return FirstAdjVex(G,u);


p=p->nextarc;


if(!p)return -1;


return LocateVex(G


,p->adjvex);


}




2


)算法 的时间复杂度分析:



遍历图的过程实质上是对每个顶点查找其 邻接点的过程,


其耗费的时间取决于所采用的存储


结构。


当以邻接表作图的存储结构时,


找邻接点所需时间为

< br>O(e)



其中


e


为无向图的边数或


有向图的弧数。


由此,

< p>
当以邻接表作存储结构时,


深度优先搜索遍历图的时间复杂度为

< p>
O(n+e)


广度优先搜索遍历图的时间复杂度和深度优先搜索遍历相同,


两者不同之处仅仅在于对顶点


访问的顺序不同。




4


.测试结果



用需求分析中的测试数据




输入:





输出:





5


、用户手册




1


)输入顶点数和弧数;




2


)输入顶点内容;


-


-


-


-


-


-


-


-



本文更新与2021-02-01 21:48,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/595331.html

实现图的遍历算法实验报告的相关文章

  • 余华爱情经典语录,余华爱情句子

    余华的经典语录——余华《第七天》40、我不怕死,一点都不怕,只怕再也不能看见你——余华《第七天》4可是我再也没遇到一个像福贵这样令我难忘的人了,对自己的经历如此清楚,

    语文
  • 心情低落的图片压抑,心情低落的图片发朋友圈

    心情压抑的图片(心太累没人理解的说说带图片)1、有时候很想找个人倾诉一下,却又不知从何说起,最终是什么也不说,只想快点睡过去,告诉自己,明天就好了。有时候,突然会觉得

    语文
  • 经典古训100句图片大全,古训名言警句

    古代经典励志名言100句译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。3良言一句三冬暖,恶语伤人六月寒。喷泉的高度不会超过它的源头;一个人的事

    语文
  • 关于青春奋斗的名人名言鲁迅,关于青年奋斗的名言鲁迅

    鲁迅名言名句大全励志1、世上本没有路,走的人多了自然便成了路。下面是我整理的鲁迅先生的名言名句大全,希望对你有所帮助!当生存时,还是将遭践踏,将遭删刈,直至于死亡而

    语文
  • 三国群英单机版手游礼包码,三国群英手机单机版攻略

    三国群英传7五神兽洞有什么用那是多一个武将技能。青龙飞升召唤出东方的守护兽,神兽之一的青龙。玄武怒流召唤出北方的守护兽,神兽之一的玄武。白虎傲啸召唤出西方的守护兽,

    语文
  • 不收费的情感挽回专家电话,情感挽回免费咨询

    免费的情感挽回机构(揭秘情感挽回机构骗局)1、牛牛(化名)向上海市公安局金山分局报案,称自己为了挽回与女友的感情,被一家名为“实花教育咨询”的情感咨询机构诈骗4万余元。

    语文