2022年图遍历的演示报告及源代汇编 .pdf





《2022年图遍历的演示报告及源代汇编 .pdf》由会员分享,可在线阅读,更多相关《2022年图遍历的演示报告及源代汇编 .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, 则返回该顶点在图中的位置; 否则返回其他信息Ge
3、tVex(G,v) 初始条件 : 图 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()
4、 初始条件 : 图 G存在,visit的顶点的应用函数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 18 页 - - - - - - - - - 计算机软件技术基础课程设计图的遍历的演示龚陈继Page 2 of 18操作结果 : 对图进行深度优先遍历 , 在遍历过程中对每个结点调用visit函数一次 ,一旦 visit失败, 则操作失败BFSTraverse(G,visit() 初始条件 : 图 G存在,visit的顶点的应用函数操作结果 : 对图进行广度优先遍历 ,
5、在遍历过程中对每个结点调用visit函数一次 ,一旦 visit失败, 则操作失败 ADT Graph 2、设定栈的抽象数据类型:ADT Stack 数据对象: D=ai | aiCharSet ,i=1,2, n,n0 数据关系: R1= | ai-1,aiD,i=2, n 基本操作:InitStack(&S) 操作结果:构造一个空栈S。DestroyStack(&S) 初始条件:栈 S 已存在。操作结果:栈 S 被销毁。Push(&S,e); 初始条件:栈 S 已存在。操作结果:在栈 S 的栈顶插入新的栈顶元素e。Pop(&S,e); 初始条件:栈 S 已存在。操作结果:删除 S 的栈顶元
6、素,并以e返回其值。StackEmpty(S) 初始条件:栈 S 已存在。操作结果:若 S 为空栈,则返回 TRUE,否则返回 FALSE。 ADT Stack 3、设定队列的抽象数据类型:ADT Queue 数据对象 : D=ai|ai属于 Elemset,i=1,2.,n,n=0 数据关系 :R1=|ai-1,ai属于 D,i=1,2,n 约定 ai 为端为队列头 ,an 为队列尾基本操作 : InitQueue(&Q) 操作结果 : 构造一个空队列 Q DestryoQueue(&Q) 初始条件:队列 Q已存在。操作结果:队列 Q被销毁,不再存在。EnQueue(&Q,e) 初始条件 :
7、 队列 Q已经存在操作结果 : 插入元素 e 为 Q的新的队尾元素DeQueue(&Q,&E) 初始条件 :Q 为非空队列操作结果 : 删除 Q的队尾元素 , 并用 e 返回其值QueueEmpty(Q) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 18 页 - - - - - - - - - 计算机软件技术基础课程设计图的遍历的演示龚陈继Page 3 of 18初始条件 : 队列已经存在操作结果 : 若队列为空 , 则返回 TRUE, 否则返回 FLASE ADT
8、Queue 4、本程序包含九个模块:1)主程序模块void main () 手动构造一个图;从文件导入一个图;显示图的信息;进行深度优先遍历图;进行广度优先遍历图;保存图到一个文件;寻找路径;销毁一个图; ;2)手动构造一个图 - 自己输入图的顶点和边生成一个图;3)从文件导入一个图;4)显示图的信息 - 打印图的所有顶点和边;5)进行深度优先遍历图 - 打出遍历的结点序列和边集;6)进行广度优先遍历图 - 打出遍历的结点序列和边集;7)保存图到一个文件;8)寻找从起点到终点,但中间不经过某点的所有简单路径;9)销毁图。三、详细设计1、顶点 , 边和图类型#define MAX_INFO 10
9、 /* 相关信息字符串的最大长度+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; /* 分别指向依附这两个顶点的下一条边 *
10、/ InfoType *info; /* 该边信息指针 */ EBox; typedef struct VertexType data; EBox *firstedge; /* 指向第一条依附该顶点的边 */ VexBox; typedef struct 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 18 页 - - - - - - - - - 计算机软件技术基础课程设计图的遍历的演示龚陈继Page 4 of 18 VexBox adjmulistMAX_VERTEX_
11、NUM; int vexnum,edgenum; /* 无向图的当前顶点数和边数 */ AMLGraph; 图的基本操作如下:int LocateVex(AMLGraph G,VertexType u);/查 G和 u 有相同特征的顶点,若存在则返回该顶点在无向图中位置; 否则返回 -1 。VertexType& GetVex(AMLGraph G,int v);/ 以 v 返回邻接多重表中序号为i 的顶点。int FirstAdjVex(AMLGraph G,VertexType v);/ 返回 v 的第一个邻接顶点的序号。若顶点在G中没有邻接顶点 , 则返回 -1。int NextAdjV
12、ex(AMLGraph G,VertexType v,VertexType w);/ 返回 v 的( 相对于 w的) 下一个邻接顶点的序号若w是 v 的最后一个邻接点 , 则返回 -1 。void CreateGraph(AMLGraph &G);/ 采用邻接多重表存储结构 , 构造无向图 G 。Status DeleteArc(AMLGraph &G,VertexType v,VertexType w);/ 在 G中删除边 。Status DeleteVex(AMLGraph &G,VertexType v);/ 在 G中删除顶点 v 及其相关的边。void DestroyGraph(AML
13、Graph &G) ;/ 销毁一个图void Display(AMLGraph G) ;/ 输出无向图的邻接多重表G 。void DFSTraverse(AMLGraph G,VertexType start,int(*visit)(VertexType);/ 从 start顶点起 , (利用栈非递归)深度优先遍历图G 。void BFSTraverse(AMLGraph G,VertexType start,int(*Visit)(VertexType);/ 从 start顶点起 , 广度优先遍历图 G 。void MarkUnvizited(AMLGraph G) ;/ 置边的访问标记为未
14、被访问。其中部分操作的伪码算法如下:void CreateGraph(AMLGraph &G) /* 采用邻接多重表存储结构, 构造无向图 G */ DestroyGraph(G); /*如果图不空 , 先销毁它 */ 输入无向图的顶点数G.vexnum ;输入无向图的边数G.edgenum ;输入顶点的信息 IncInfo ;依次输入无向图的所有顶点;for(k=0;kmark=unvisited; /* 设初值 */ 耍 p-ivex=i; p-jvex=j; p?info=NULL;M p-ilink=G.adjmulisti.firstedge; /* 插在表头 */ G.adjmul
15、isti.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(!p-mark) /* 只输出一次 */ coutG.adjmulisti.data-jvex.datamark=visited; p=p-ilink; else /* 边的 j 端与该顶点有关 */
16、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(G,start); /*先确定起点 start在无向图中的位置 */ for(v=0;vG.vexnum;v+) Visitedv=0; /*置初值 */ fo
17、r(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+) Visitedv=0; /* 置初值 */ InitQueue(Q); z=LocateVex(G,start); /*
18、先确定起点 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); /*销毁队列 , 释放其占用空间 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 18 页 - - - - - - - - -
19、计算机软件技术基础课程设计图的遍历的演示龚陈继Page 7 of 18 2、栈类型#define STACK_INIT_SIZE 100 /* 存储空间初始分量 */ #define STACKINCREMENT 10 /* 存储空间分配增量 */ typedef int SElemType; typedef struct SElemType *base; SElemType *top; /*栈顶指针 */ int stacksize; SqStack; 栈的基本操作如下:Status InitStack(SqStack &S);/ 构造一个空栈 S。Status DestroyStack(S
20、qStack &S);/ 销毁栈 S(无论空否均可 ) 。Status Push(SqStack &S,SElemType e) ;/ 在 S的栈顶插入新的栈顶元素e。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,*QueueP
21、tr; typedef struct QueuePtr front; QueuePtr rear; /* 队头、队尾指针 */ LinkQueue; 队列的基本操作如下:Status InitQueue(LinkQueue &Q);/ 构造一个空队列 Q 。Status DestroyQueue(LinkQueue &Q) ;/ 销毁队列 Q(无论空否均可 ) 。Status QueueEmpty(LinkQueue Q) ;/ 若 Q为空队列 , 则返回 1, 否则返回 -1。Status EnQueue(LinkQueue &Q,QElemType e);/ 插入元素 e 为 Q的新的队尾
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年图遍历的演示报告及源代汇编 2022 遍历 演示 报告 汇编

限制150内