数据结构课程实验(图的存储与遍历).doc_第1页
数据结构课程实验(图的存储与遍历).doc_第2页
数据结构课程实验(图的存储与遍历).doc_第3页
数据结构课程实验(图的存储与遍历).doc_第4页
数据结构课程实验(图的存储与遍历).doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验五 图的存储与遍历1、实验目的掌握图这种复杂的非线性结构的邻接矩阵和邻接表的存储表示,以及在此两种常用存储方式下深度优先遍历(dfs)和广度优先遍历(BFS)操作的实现。2、实验预备知识(1)图的存储结构:邻接矩阵表示法和邻接表表示法。邻接矩阵表示法除了要用一个二维数组存储用于表示顶点间相邻关系的邻接矩阵外,还需用一个一维数组来存储顶点信息,另外还有图的顶点数和边数。邻接表表示法类似于树的孩子链表表示法。(2)图的遍历方法有深度优先遍历(DepthFirst Traersal)和广度优先遍历(BreadthFirst Traversal),简称 DFS和BFS。DFS对图遍历时尽可能先对纵深方向进行搜索;BFS是类似于树的按层次遍历。 3、实验内容题目1 对以邻接矩阵为存储结构的图进行 DFS和 BFS遍历(1) 问题描述:以邻接矩阵为图的存储结构,实现图的DFS和BFS遍历。(2) 基本要求:建立一个图的邻接矩阵表示,输出顶点的一种DFS和BFS序列。(3) 测试数据:如图418所示。(4) 实现提示:图的DFS遍历可通过递归调用或用栈来实现。其思想是:只要当前结点未访问过,就访问该结点,沿着其一条分支深入下去,每深入一个未访问过的结点,就访问这个结点,然后从这个结点继续进行DFS遍历。在这一过程中,若深入时遇到一个已访问过的结点,则查找是否有与这个结点相邻的下一个未访问过的结点。若有则继续深人,否则将退回到这个结点的前一个结点,再找下一个相邻的本访问过的结点,如此进行下去,直到所有的结点都被访问过。BFS遍历可利用队列来帮助实现,也可以用栈。实现方法与二叉树的层次遍历类似。题目2 对以邻接表为存储结构的图进行DFS和BFS遍历(1) 问题描述:以邻接表为存储结构,实现图的DFS和BFS遍历。(2) 基本要求:建立一个图的邻接表存储,输出顶点的一种DFS和BFS序列。(3) 测试数据:如图4.19所示:(4) 实现提示:以邻接表为存储结构的图的DFS和BFS算法的实现思想与以邻接矩阵为存储结构的实现是一样的。只是由于图的存储形式不同。而具体到取第一个邻接点和下一个邻接点的语句表示上有所差别而已。4、实验步骤(1)仔细分析实验内容,给出其算法和流程图;(2)用C语言实现该算法;(3)给出测试数据,并分析其结果;(4)在实验报告册上写出实验过程。5、实验报告要求实验报告要求书写整齐,步骤完整,实验报告格式如下:1、实验目的2、实验设备3、实验步骤4、实验内容5、实验结果(结论)程序如下:/*sy41.c*/#define MaxVertexNum 10 /设最大顶点数为10#include #include typedef char VertexType;typedef int EdgeType;typedef structchar vexs10;int edges1010;int n,e;MGraph;#define FALSE 0#define TRUE 1#define Error printfint visited10;void CreateMGraph(MGraph *G);void DFSTraverseM(MGraph *G);void BFSTraverseM(MGraph *G);void DFSM(MGraph *G,int i);void BFSM(MGraph *G,int i);#define QueueSize 30 /*假定预分配的队列空间最多为30*/typedef int DataType; /*队列中的元素类型为字符型*/typedef structint front; /*队头指针,队非空时指向队头元素*/int rear; /*队尾指针,队非空时指向队尾元素的下一位置*/int count; /*计数器,记录队中元素总数*/DataType dataQueueSize;CirQueue;void InitQueue(CirQueue *Q) /*初始队列*/Q-front=Q-rear=0;Q-count=0;int QueueEmpty(CirQueue *Q) /*判队空*/return Q-count=0;int QueueFull(CirQueue *Q) /*判队满*/return Q-count=QueueSize;void EnQueue(CirQueue *Q,DataType x) /*入队*/if (QueueFull(Q)Error(Queue overflow); /*队满上溢*/else Q-count+; /*队列元素个数加1*/Q-dataQ-rear=x; /*新元素插入队列*/Q-rear=(Q-rear+1)%QueueSize; /*循环队列的尾指针加1*/DataType DeQueue(CirQueue *Q) /*出队*/DataType temp;if (QueueEmpty(Q)Error(Queue underflow); /*队空下溢*/else temp=Q-dataQ-front;Q-count-; /*队列元素个数减1*/Q-front=(Q-front+1)%QueueSize; /*循环队列的头指针加1*/return temp;main()MGraph *G; /*定义一个以邻接矩阵为存储类型的图G*/char ch1,ch2;printf(create graph(adjoining matrix ):n); /*创建图G的存储*/CreateMGraph(G);ch1=y;while(ch1=y | ch1=Y)printf(select:n);printf(nA-update graph(adjoining matrix ) );printf(nB-Degree First search );printf(nC-breadth First search );printf(nD-exitn);scanf(n%c,&ch2);switch (ch2)case A:case a:CreateMGraph(G);printf(create graph success 。n);break;case B:case b:DFSTraverseM(G);break;case C:case c:BFSTraverseM(G);break;case D:case d:ch1=n;break;default:ch1=n;void CreateMGraph(MGraph *G)/*建立有向图G的邻接矩阵存储*/int i,j,k,w;char ch;printf(input vertex number and edge number(input format:vn,en):n);/*输入顶点数和边数,输入格式:顶点数,边数*/scanf(%d,%d,&(G-n),&(G-e);printf(input vertex(input format:serial number):n);/*输入顶点信息,建立顶点表,输入格式为:顶点号)/*/for (i=0;in;i+)scanf(%c,&(G-vexsi);for (i=0;in;i+)for (j=0;jn;j+)G-edgesij=0; /*初始化邻接矩阵*/printf(input edge(format:i,j):n);/*输入e条边,输入格式为:i,j*/for (k=0;ke;k+)scanf(%d,%d,&i,&j); /*输入e条边,建立邻接矩阵*/G-edgesij=1;/*CreateMGraph*/void DFSTraverseM(MGraph *G)/*深度优先遍历以邻接矩阵存储的图G*/int i;printf(Degree First searchn);for (i=0;in;i+)visitedi=FALSE; /*标志向量初始化*/for (i=0;in;i+)if (!visitedi) DFSM(G,i);/*Vi未访问过,以Vi为原点开始DFS搜索*/*DFSTraverse*/void DFSM(MGraph *G,int i)/*以Vi为出发点,对邻接矩阵存储的图G进行DFS搜索*/int j;printf(vertex:V%cn,G-vexsi); /*访问顶点Vi*/visitedi=TRUE;for (j=0;jn;j+) /*依次搜索Vi的邻接点*/if (G-edgesij=1 & !visitedj)DFSM(G,j); /*当E,且Vj未访问过时,以Vj为新的出发点继续按深度优先遍历*/*DFSM*/void BFSTraverseM(MGraph *G)/*广度优先遍历邻接矩阵存储的图G*/int i;printf(breadth First searchn);for (i=0;in;i+)visitedi=FALSE; /*标志向量初始化*/for (i=0;in;i+)if (!visitedi) BFSM(G,i);/*Vi未访问过,以Vi为原点开始BFS搜索*/*BFSTraverseM*/void BFSM(MGraph *G,int k)/*以Vi为出发点,对邻接矩阵存储的图G进行BFS搜索*/int i,j;CirQueue Q;InitQueue(&Q);printf(vertex:v%cn,G-vexsk);visitedk=TRUE;En

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论