《图的基本操作-实验报告(共10页).doc》由会员分享,可在线阅读,更多相关《图的基本操作-实验报告(共10页).doc(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上实验五 图的基本操作一、实验目的1、使学生可以巩固所学的有关图的基本知识。2、熟练掌握图的存储结构。3、熟练掌握图的两种遍历算法。二、实验内容问题描述对给定图,实现图的深度优先遍历和广度优先遍历。基本要求以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。【测试数据】由学生依据软件工程的测试技术自己确定。三、实验前的准备工作1、掌握图的相关概念。2、掌握图的逻辑结构和存储结构。3、掌握图的两种遍历算法的实现。四、实验报告要求1、实验报告要按照实验报告格式规范书写。2、实验上要写出多批测试数据的运行结果。
2、3、结合运行结果,对程序进行分析。五、算法设计1、 程序所需头文件已经预处理宏定义和结构体定义如下#include#define MaxVerNum 100struct edgenodeint endver;int inform;edgenode* edgenext; ;struct vexnode char vertex;edgenode* edgelink;struct Graph vexnode adjlistsMaxVerNum;int vexnum;int arcnum;2、 创建无向图void CreatAdjList(Graph* G)int i,j,k;edgenode* p1
3、;edgenode* p2;cout请输入顶点数和边数:G-vexnumG-arcnum;cout开始输入顶点表:endl;for (i=0;ivexnum;i+)cinG-adjlistsi.vertex;G-adjlistsi.edgelink=NULL;cout开始输入边表信息:endl;for (k=0;karcnum;k+)cout请输入边对应的顶点:;cinij;p1=new edgenode;p1-endver=j;p1-edgenext=G-adjlistsi.edgelink;G-adjlistsi.edgelink=p1;p2=new edgenode;p2-endver=
4、i;p2-edgenext=G-adjlistsj.edgelink;G-adjlistsj.edgelink=p2;/因为是无向图,所以有两次建立边表的过程3、 深度优先遍历void DFS(Graph *G,int i,int visit)coutadjlistsi.vertexadjlistsi.edgelink;if(G-adjlistsi.edgelink&!visitp-endver)DFS(G,p-endver,visit);void DFStraversal(Graph *G,char c)/深度优先遍历cout该图的深度优先遍历结果为:endl;int visitMaxVer
5、Num;for(int i=0;ivexnum;i+)visiti=0;/全部初始化为0,即未访问状态int m;for (i=0;ivexnum;i+)if (G-adjlistsi.vertex=c)/根据字符查找序号m=i;DFS(G,i,visit);break;/继续访问未被访问的结点for(i=0;ivexnum;i+)if(visiti=0)DFS(G,i,visit);coutfront=Q-rear=NULL;EnQueue(Q,v);while(Q-rear!=NULL)int e=0;DeQueue(Q,&e);coutadjlistse.vertexadjlistse.
6、edgelink;if(p)int m=p-endver;if(m=0)EnQueue(Q,m);while(visitm=0)p=p-edgenext;if(p=NULL)break;m=p-endver;EnQueue(Q,m);void BFStraversal(Graph *G,char c)cout该图的广度优先遍历结果为:endl;int visitedMaxVerNum;for (int i=0;ivexnum;i+)visitedi=0;int m;for (i=0;ivexnum;i+)if (G-adjlistsi.vertex=c)m=i;BFS(G,i,visited)
7、;break;/继续访问未被访问的结点for(i=0;ivexnum;i+)if(visitedi=0)BFS(G,i,visited);coutendl;六、调试与测试 测试数据,如图:七、总结通过做这次实验,发现自己在数据结构这门课中还有很多不足有很多知识还没掌握,所以在写程序的时候出现了很多的错误,及还有很多的知识不以灵活运用。C+没有掌握好,所以这次做本次实验还是吃力,刚开始完全没有思路,后来经过查找资料,在自己的努力下和同学的帮助下,终于完了本次实验,此次实验发现的自己的不足,在以后的学习中,我会更加的努力。八、源代码#include#define MaxVerNum 100stru
8、ct edgenodeint endver;int inform;edgenode* edgenext; ;struct vexnode char vertex;edgenode* edgelink;struct Graph vexnode adjlistsMaxVerNum;int vexnum;int arcnum;/队列的定义及相关函数的实现struct QueueNodeint nData;QueueNode* next;struct QueueList QueueNode* front;QueueNode* rear;void EnQueue(QueueList* Q,int e)Q
9、ueueNode *q=new QueueNode;q-nData=e;q-next=NULL;if(Q=NULL)return;if(Q-rear=NULL)Q-front=Q-rear=q;elseQ-rear-next=q;Q-rear=Q-rear-next;void DeQueue(QueueList* Q,int* e)if (Q=NULL)return;if (Q-front=Q-rear)*e=Q-front-nData;Q-front=Q-rear=NULL;else*e=Q-front-nData;Q-front=Q-front-next;/创建图void CreatAdj
10、List(Graph* G)int i,j,k;edgenode* p1;edgenode* p2;cout请输入顶点数和边数:G-vexnumG-arcnum;cout开始输入顶点表:endl;for (i=0;ivexnum;i+)cinG-adjlistsi.vertex;G-adjlistsi.edgelink=NULL;cout开始输入边表信息:endl;for (k=0;karcnum;k+)cout请输入边对应的顶点:;cinij;p1=new edgenode;p1-endver=j;p1-edgenext=G-adjlistsi.edgelink;G-adjlistsi.ed
11、gelink=p1;p2=new edgenode;p2-endver=i;p2-edgenext=G-adjlistsj.edgelink;G-adjlistsj.edgelink=p2;/因为是无向图,所以有两次建立边表的过程/深度优先遍历void DFS(Graph *G,int i,int visit)coutadjlistsi.vertexadjlistsi.edgelink;if(G-adjlistsi.edgelink&!visitp-endver)DFS(G,p-endver,visit);void DFStraversal(Graph *G,char c)/深度优先遍历cou
12、t该图的深度优先遍历结果为:endl;int visitMaxVerNum;for(int i=0;ivexnum;i+)visiti=0;/全部初始化为0,即未访问状态int m;for (i=0;ivexnum;i+)if (G-adjlistsi.vertex=c)/根据字符查找序号m=i;DFS(G,i,visit);break;/继续访问未被访问的结点for(i=0;ivexnum;i+)if(visiti=0)DFS(G,i,visit);coutfront=Q-rear=NULL;EnQueue(Q,v);while(Q-rear!=NULL)int e=0;DeQueue(Q,
13、&e);coutadjlistse.vertexadjlistse.edgelink;if(p)int m=p-endver;if(m=0)EnQueue(Q,m);while(visitm=0)p=p-edgenext;if(p=NULL)break;m=p-endver;EnQueue(Q,m);void BFStraversal(Graph *G,char c)cout该图的广度优先遍历结果为:endl;int visitedMaxVerNum;for (int i=0;ivexnum;i+)visitedi=0;int m;for (i=0;ivexnum;i+)if (G-adjlistsi.vertex=c)m=i;BFS(G,i,visited);break;/继续访问未被访问的结点for(i=0;ivexnum;i+)if(visitedi=0)BFS(G,i,visited);coutendl;void main()Graph * G=new Graph;CreatAdjList(G);char ch;coutch;DFStraversal(G,ch);BFStraversal(G,ch);专心-专注-专业
限制150内