图遍历的演示报告及源代码.pdf





《图遍历的演示报告及源代码.pdf》由会员分享,可在线阅读,更多相关《图遍历的演示报告及源代码.pdf(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、计算机软件技术基础课程设计 图的遍历的演示 龚陈继 Page 1 of 18 题 5.3 图遍历的演示 实习报告 题目:试设计一个程序,演示在连通的无向图上访问全部结点的操作 一、需求分析 1、以邻接多重表为存储结构;2、实现连通和非连通的无向图的深度优先和广度优先遍历;3、要求利用栈实现无向图的深度优先遍历;4、以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和生成树的边集;5、用凹入表打印生成树;6、求出从一个结点到另外一个结点,但不经过另外一个指定结点的所有简单路径;6、本程序用 C+语言编写,在 Visial C+6.0环境下通过。二、概要设计 1、设定图的抽象数据类型:ADT
2、 Graph 数据对象 V:V 是具有相同特性的数据元素的集合,称为点集.数据关系 R:R=VR VR=(v,w)|v,w 属于 V,(v,w)表示 v 和 w 之间存在的路径 基本操作 P:CreatGraph(&G,V,VR)初始条件:V 是图的顶点集,VR 是图中弧的集合.操作结果:按 V 和 VR 是定义构造图 G.DestroyGraph(&G)初始条件:图 G 存在 操作结果:销毁图 G LocateVex(G,u)初始条件:图 G 存在,u 和 G 中顶点有相同的特征 操作结果:若图 G 中存在顶点 u,则返回该顶点在图中的位置;否则返回其他信息 GetVex(G,v)初始条件:
3、图 G 存在,v 是 G 中顶点 操作结果:返回 v 的值 FirstAjvex(G,v)初始条件:图 G 存在,v 是 G 中顶点 操作结果:返回 v 的第一个邻接顶点,若顶在图中没有邻接顶点,则返回为空 NextAjvex(G,v,w)初始条件:图 G 存在,v 是 G 中顶点,w 是 v 的邻接顶点 操作结果:返回 v 的下一个邻接顶点,若 w 是 v 的最后一个邻接顶点,则返回空 DeleteVexx(&G,v)初始条件:图 G 存在,v 是 G 中顶点 操作结果:删除顶点 v 已经其相关的弧 DFSTraverse(G,visit()初始条件:图 G 存在,visit 的顶点的应用函
4、数 计算机软件技术基础课程设计 图的遍历的演示 龚陈继 Page 2 of 18 操作结果:对图进行深度优先遍历,在遍历过程中对每个结点调用 visit 函数一次,一旦 visit 失败,则操作失败 BFSTraverse(G,visit()初始条件:图 G 存在,visit 的顶点的应用函数 操作结果:对图进行广度优先遍历,在遍历过程中对每个结点调用 visit 函数一次,一旦 visit 失败,则操作失败 ADT Graph 2、设定栈的抽象数据类型:ADT Stack 数据对象:D=ai|aiCharSet,i=1,2,n,n0 数据关系:R1=|ai-1,aiD,i=2,n 基本操作:
5、InitStack(&S)操作结果:构造一个空栈 S。DestroyStack(&S)初始条件:栈 S 已存在。操作结果:栈 S 被销毁。Push(&S,e);初始条件:栈 S 已存在。操作结果:在栈 S 的栈顶插入新的栈顶元素 e。Pop(&S,e);初始条件:栈 S 已存在。操作结果:删除 S 的栈顶元素,并以 e 返回其值。StackEmpty(S)初始条件:栈 S 已存在。操作结果:若 S 为空栈,则返回 TRUE,否则返回 FALSE。ADT Stack 3、设定队列的抽象数据类型:ADT Queue 数据对象:D=ai|ai 属于 Elemset,i=1,2.,n,n=0 数据关系
6、:R1=|ai-1,ai属于 D,i=1,2,n 约定 ai 为端为队列头,an 为队列尾 基本操作:InitQueue(&Q)操作结果:构造一个空队列 Q DestryoQueue(&Q)初始条件:队列 Q 已存在。操作结果:队列 Q 被销毁,不再存在。EnQueue(&Q,e)初始条件:队列 Q 已经存在 操作结果:插入元素 e 为 Q 的新的队尾元素 DeQueue(&Q,&E)初始条件:Q 为非空队列 操作结果:删除 Q 的队尾元素,并用 e 返回其值 QueueEmpty(Q)计算机软件技术基础课程设计 图的遍历的演示 龚陈继 Page 3 of 18 初始条件:队列已经存在 操作结
7、果:若队列为空,则返回 TRUE,否则返回 FLASE ADT Queue 4、本程序包含九个模块:1)主程序模块 void main()手动构造一个图;从文件导入一个图;显示图的信息;进行深度优先遍历图;进行广度优先遍历图;保存图到一个文件;寻找路径;销毁一个图;2)手动构造一个图-自己输入图的顶点和边生成一个图;3)从文件导入一个图;4)显示图的信息-打印图的所有顶点和边;5)进行深度优先遍历图-打出遍历的结点序列和边集;6)进行广度优先遍历图-打出遍历的结点序列和边集;7)保存图到一个文件;8)寻找从起点到终点,但中间不经过某点的所有简单路径;9)销毁图。三、详细设计 1、顶点,边和图类
8、型#define MAX_INFO 10 /*相关信息字符串的最大长度+1*/#define MAX_VERTEX_NUM 20 /*图中顶点数的最大值*/typedef char InfoType;/*相关信息类型*/typedef char VertexType;/*字符类型*/typedef enumunvisited,visitedVisitIf;typedef struct EBox VisitIf mark;/*访问标记*/int ivex,jvex;/*该边依附的两个顶点的位置*/struct EBox *ilink,*jlink;/*分别指向依附这两个顶点的下一条边*/Info
9、Type *info;/*该边信息指针*/EBox;typedef struct VertexType data;EBox *firstedge;/*指向第一条依附该顶点的边*/VexBox;typedef struct 计算机软件技术基础课程设计 图的遍历的演示 龚陈继 Page 4 of 18 VexBox adjmulistMAX_VERTEX_NUM;int vexnum,edgenum;/*无向图的当前顶点数和边数*/AMLGraph;图的基本操作如下:int LocateVex(AMLGraph G,VertexType u);/查 G 和 u 有相同特征的顶点,若存在则返回该顶点
10、在无向图中位置;否则返回-1。VertexType&GetVex(AMLGraph G,int v);/以 v 返回邻接多重表中序号为 i 的顶点。int FirstAdjVex(AMLGraph G,VertexType v);/返回 v 的第一个邻接顶点的序号。若顶点在G 中没有邻接顶点,则返回-1。int NextAdjVex(AMLGraph G,VertexType v,VertexType w);/返回 v 的(相对于 w 的)下一个邻接顶点的序号若 w 是 v 的最后一个邻接点,则返回-1。void CreateGraph(AMLGraph&G);/采用邻接多重表存储结构,构造无
11、向图 G。Status DeleteArc(AMLGraph&G,VertexType v,VertexType w);/在 G 中删除边。Status DeleteVex(AMLGraph&G,VertexType v);/在 G 中删除顶点 v 及其相关的边。void DestroyGraph(AMLGraph&G);/销毁一个图 void Display(AMLGraph G);/输出无向图的邻接多重表G。void DFSTraverse(AMLGraph G,VertexType start,int(*visit)(VertexType);/从 start 顶点起,(利用栈非递归)深度
12、优先遍历图G。void BFSTraverse(AMLGraph G,VertexType start,int(*Visit)(VertexType);/从 start 顶点起,广度优先遍历图 G。void MarkUnvizited(AMLGraph G);/置边的访问标记为未被访问。其中部分操作的伪码算法如下:void CreateGraph(AMLGraph&G)/*采用邻接多重表存储结构,构造无向图 G*/DestroyGraph(G);/*如果图不空,先销毁它*/输入无向图的顶点数 G.vexnum;输入无向图的边数 G.edgenum;输入顶点的信息 IncInfo;依次输入无向图
13、的所有顶点;for(k=0;kmark=unvisited;/*设初值*/耍 p-ivex=i;p-jvex=j;pinfo=NULL;M p-ilink=G.adjmulisti.firstedge;/*插在表头*/G.adjmulisti.firstedge=p;p-jlink=G.adjmulistj.firstedge;/*插在表头*/G.adjmulistj.firstedge=p;void Display(AMLGraph G)/*输出无向图的邻接多重表G*/MarkUnvizited(G);输出无向图的所有顶点;for(i=0;iivex=i)/*边的 i 端与该顶点有关*/if
14、(!p-mark)/*只输出一次*/coutG.adjmulisti.data-jvex.datamark=visited;p=p-ilink;else/*边的 j 端与该顶点有关*/if(!p-mark)/*只输出一次*/coutivex.data-G.adjmulisti.datamark=visited;p=p-jlink;coutendl;void DFSTraverse(AMLGraph G,VertexType start,int(*visit)(VertexType)/*从 start 顶点起,深度优先遍历图 G(非递归算法)*/InitStack(S);w=LocateVex(
15、G,start);/*先确定起点 start 在无向图中的位置*/for(v=0;vG.vexnum;v+)Visitedv=0;/*置初值*/for(v=0;v=0;w=NextAdjVex(G,G.adjmulistu.data,G.adjmulistw.data)if(!Visitedw)Push(S,w);DestroyStack(S);/*销毁栈,释放其空间*/void BFSTraverse(AMLGraph G,VertexType start,int(*Visit)(VertexType)/*从 start 顶点起,广度优先遍历图 G*/for(v=0;vG.vexnum;v+
16、)Visitedv=0;/*置初值*/InitQueue(Q);z=LocateVex(G,start);/*先确定起点 start 在无向图中的位置*/for(v=0;v=0;w=NextAdjVex(G,G.adjmulistu.data,G.adjmulistw.data)if(!Visitedw)Visitedw=1;Visit(G.adjmulistw.data);EnQueue(Q,w);DestroyQueue(Q);/*销毁队列,释放其占用空间*/计算机软件技术基础课程设计 图的遍历的演示 龚陈继 Page 7 of 18 2、栈类型#define STACK_INIT_SIZ
17、E 100 /*存储空间初始分量*/#define STACKINCREMENT 10 /*存储空间分配增量*/typedef int SElemType;typedef struct SElemType *base;SElemType *top;/*栈顶指针*/int stacksize;SqStack;栈的基本操作如下:Status InitStack(SqStack&S);/构造一个空栈 S。Status DestroyStack(SqStack&S);/销毁栈 S(无论空否均可)。Status Push(SqStack&S,SElemType e);/在 S 的栈顶插入新的栈顶元素 e
18、。Status Pop(SqStack&S,SElemType&e);/删除 S 的栈顶元素并以 e 带回其值。Status StackEmpty(SqStack S);/若 S 为空栈,则返回 TRUE,否则返回 FALSE。3、队列类型 typedef int QelemType;typedef struct QNode QElemType data;struct QNode*next;QNode,*QueuePtr;typedef struct QueuePtr front;QueuePtr rear;/*队头、队尾指针*/LinkQueue;队列的基本操作如下:Status InitQ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遍历 演示 报告 源代码

限制150内