《数据结构图的操作.docx》由会员分享,可在线阅读,更多相关《数据结构图的操作.docx(15页珍藏版)》请在第一文库网上搜索。
1、实验7:图的操作算法一、实验目的1 .熟悉各种图的存储结构。2 .掌握图的各种搜索路径的遍历方法。二、实验内容1设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。算法:#inc1ude#inc1ude#inc1ude#inc1ude#defineMAXV10#defineINF980708usingnamespacestd;typedefintInfoType;邻接矩阵typedefstruct(intno;InfoTypeinfo;JVertexType;顶点类型typedefstruct(intedgesMAXVMAXV
2、;intnze;VertexTypevesMAXV;MatGraph;完整的图邻接矩阵类型邻接表typedefstructANode(intadjve;structANode*nextarc;intweight;ArCNOde;边结点类型typedefstructVnodeInfoTypeinfo;ArcNode*firstarc;VNode;邻接表的头结点类型typedefstruct(VNodeadj1istMAXV;intn,e;AdjGraph;完整的图邻接表类型typedefstruct(InfoTypedataMAXV;intfront,rear;SqQueue;队列初始化队列vo
3、idInitQUeUe(SqQUeUe*&q)(q=(SqQueue*)ma11oc(sizeof(SqQueue);q-front=q-rear=-1;)判断队列是否为空boo1QueueEmptyfSqQueue*q)(return(q-front=q-rear);)进队列boo1eQueue(SqQueue*&q,InfoTypee)(if(q-rear=MAXV)returnfa1se;q-rear+;q-dataq-rear=e;returntrue;)出队列boo1deQueue(SqQueue*&q,InfoType&e)(if(q-front=q-rear)returnfa1s
4、e;q-front=(q-front+1)%MAXV;e=q-dataq-front;returntrue;)创建邻接表voidCreateAdj(AdjGraph*&GJntAMAXVMAXVJntnjnte)(intij;ArcNode*p;G=(AdjGraph*)ma11oc(sizeof(AdjGraph);for(i=0;iadj1isti.firstarc=NU11;for(i=0;i=OJ-)if(Aij!=O&Ai0!=INF)p=(ArcNode*)ma11oc(sizeof(ArcNode);p-adjvex=j;p-nextarc=G-adjIisti.firstarc
5、;G-adj1isti.firstarc=p;)G-n=n;G-e=e;)输出邻接表voidDispAdj(AdjGraph*G)(COUt“邻接表存储:end1;inti;ArcNode*p;for(i=0;in;i+)(p=G-adj1isti.firstarc;printf(%3dzi);printf(%3d-,J);whi1e(p!=NU11)(printf(%3d-,p-adjvex);p=p-nextarc;)coutAend1;)/DFS深度优先遍历intvisitedMAXV=0;voidDFSfAdjGraph*G,intv)(ArcNode*p;visitedv=1;cou
6、tadj1istv.firstarc;whi1e(p!=NU11)(if(visitedp-adjvex=O)DFS(G,p-adjvex);p=p-nextarc;)/BFS广度优先遍历voidBFS(AdjGraph*GJntv)(intWjjArcNode*p;SqQueue*qu;InitQueue(qu);intvisited1MAXV;for(inti=0;in;i+)visited1i=O;printf(%2d,v);visited1v=1;enQueue(qu,v);whi1e(!QueueEmpty(qu)(deQueue(quzw);p=G-adj1istw.firstar
7、c;whi1e(p!=NU11)(if(visited1p-adjvex=O)(printf(%2d,p-adjvex);visited1p-adjvex=1;eQueue(qu,p-adjvex);p=p-nextarc;)coutend1;)销毁邻接表voidDestroyAdj(AdjGraph*&G)(inti;ArcNode*pre,*p;for(i=0;in;i+)(pre=G-adj1isti.firstarc;if(pre!=NU11)(p=pre-nextarc;whi1e(p!=NU11)(free(pre);pre=p;p=p-nextarc;free(pre);)fre
8、e(G);)创建邻接矩阵voidCreatMat(MatGraph*&GJntnjnte)(intij1jj1znum1,num2;G=(MatGraph*)ma11oc(sizeof(MatGraph);邻接矩阵初始化for(i=0;in;i+)(for(j=0;jedgesij=O;)顶点信息COUt请输入顶点编号end1;for(i=0;iG-vexsi.no;边信息for(i=0;ie;i+)(COUt”请输入起始端点编号和终止端点编号*i1j1;for(j=0;jvexsj.no=i1)num1=j;if(G-vexsj.no=j1)num2=j;)G-edgesnum1num2=1
9、;)G-n=n;G-e=e;)输出邻接矩阵voidDispMat(MatGraph*G)(cout”邻接矩阵存储:end1;couttt;for(inti=0;in;i+)coutvexsi.not;coutend1;for(inti=0;in;i+)(couttvexsi.not;for(intj=O;jn;j+)coutedgesijt;coutend1;)intmain()(intnze,v1;MatGraph*G;AdjGraph*p;COUt请输入顶点个数n;COUt请输入边的个数e;CreatMat(G,nze);DispMat(G);CreateAdj(p,G-edges,nze
10、);DispAdj(p);COUtv;DFS(pzv);coutend1;COUtv1;BFS(p,v1);COUt销毁图IE-2-3-1:13运行结果:请输入顶点个数3输入边的个数1输入顶点编号12345请输入起始端点编号和终止端点编号13请输入起始端点编号和终止端点编号14请输入起始端点编号和终止端点编号12请输入起始端点编号和终止端点编号43请输入起始端点编号和终止端点编号2 4请输入起始端点编号和终止端点编号3 5请输入起始端点编号和终止端点编号5 2邻接矩阵存储:2-3-请输入初始点:1请输入初始点:1, -S TJTJ-IJnJTJ LLLLL 13 4 2 It t: - - -
11、 S /(mlIi-J深 1o 1 2 3 4 S接O.1:2:3:4:F4存在问题:无2.求两点之间最短路径。算法设计:求两点之间最短路径。#inc1ude#inc1ude#inc1ude#inc1ude#defineINF32767#defineMAXVIOOusingnamespacestd;typedefcharInfoType;以下定义邻接矩阵类型typedefstructintno;顶点编号InfoTypeinfo;顶点其他信息VertexType;typedefstruct顶点类型intedgesMAXVMAXV;邻接矩阵数组intnze;顶点数,边数VertexTypevexsMAXV;存放顶点信息MatGraph;完整的图邻接矩阵类型voidCreateMat(MatGraph&g,intAMAXVMAXVJntnjnte)仓IJ建图的邻接矩阵inti,j;g.n=n;g.e=e;for(i=0;ig,n;i+)for(j=O;jg.n;j+)g.edgesij=Aij;voidDispMat(MatGraphg)输出邻接矩阵ginti,j;for(i=0;ig,n;i+)for(j=O;jg,n;j+)if(g.edgesij!=INF)printf(%4d,g.edgesi