数据结构图的实现.docx
- 文档编号:2443431
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:13
- 大小:252.44KB
数据结构图的实现.docx
《数据结构图的实现.docx》由会员分享,可在线阅读,更多相关《数据结构图的实现.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构图的实现
实验报告
课程名称数据结构实验名称图的实现
系专业班级指导教师
学号姓名实验日期实验成绩
一、实验目的
(1)掌握图的逻辑结构;
(2)掌握图的邻接矩阵存储结构;
(3)验证图的邻接矩阵存储及其遍历操作的实现。
二、实验内容
(1)建立无向图的邻接矩阵(邻接表)存储;
(2)对建立的无向图,进行深度优先遍历;
(3)对建立的无向图,进行广度优先遍历;
(4)求出每个节点的度;
(5)改造无向图算法为有向图算法,实现有向图的邻接矩阵存储、进行深度及广度优先遍历,并求出每个节点的出度和入度。
(选做)
三、设计与编码
1.本实验用到的理论知识
2.算法设计
3.编码
packagegraph;
importjava.util.Scanner;
publicclassGraph{
staticfinalintMaxNum=20;//最大节点数目
//用long的最大数来表示无穷大
staticfinallongMaxValue=9223372036854775807L;
char[]Vertex=newchar[MaxNum];//定义数组,保存顶点信息
intGType;//图的类型0:
无向图,1:
有向图
intVertxNum;//顶点的数量
intEdgeNum;//边的数量
long[][]EdgeWeight=newlong[MaxNum][MaxNum];//矩阵保存顶点
int[]isTrav=newint[MaxNum];//用来标记顶点是否已深度遍历
//创建图
publicvoidCreateGraph(Graphg){
inti,j,k;
longweight;//权
charEstartV,EndV;//边的起始顶点
System.out.println("输入途中各顶点的信息");
Scannerscan=newScanner(System.in);
for(i=0;i System.out.println("第"+(i+1)+"个顶点"); g.Vertex[i]=(scan.next().toCharArray())[0]; } System.out.println("输入构成各边的顶点和权值"); for(k=0;k System.out.println("第"+(k+1)+"条边: "); EstartV=scan.next().charAt(0); EndV=scan.next().charAt(0); weight=scan.nextInt(); for(i=0;EstartV! =g.Vertex[i];i++);//查找开始节点 for(j=0;EndV! =g.Vertex[j];j++);//查找终结点 g.EdgeWeight[i][j]=weight;//对应边的权重 if(g.GType==0)//无向图,在对角位置保存权重 g.EdgeWeight[j][i]=weight; } } //清空图,将所有的矩阵元素设为无穷大 publicvoidClearGraph(Graphg){ inti,j; for(i=0;i for(j=0;j //设置矩阵中各元素的值为MaxValue g.EdgeWeight[i][j]=Graph.MaxValue; } //输出邻接矩阵 publicvoidPrintGraph(Graphg){ inti,j; for(j=0;j System.out.print("\t"+g.Vertex[j]);//输入顶点信息 System.out.println(); for(i=0;i System.out.print(g.Vertex[i]); for(j=0;j if(g.EdgeWeight[i][j]==Graph.MaxValue)//若权值为无穷大 System.out.print("\t&");//&表示无穷大 else System.out.print("\t"+g.EdgeWeight[i][j]); } System.out.println(); } } //深度遍历 publicvoidDeepTraOne(Graphg,intn){//从第n个节点开始遍历 inti; g.isTrav[n]=1;//标记为1表示该顶点已经被处理过 System.out.println(g.Vertex[n]);//输出节点 for(i=0;i if(g.EdgeWeight[n][i]! =g.MaxValue&&g.isTrav[i]==0){ DeepTraOne(g,i);//递归进行遍历 } } } publicvoidDeepTraGraph(Graphg){ inti; for(i=0;i g.isTrav[i]=0; } System.out.println("深度优先遍历: "); for(i=0;i if(g.isTrav[i]==0) DeepTraOne(g,i); } System.out.println(); } //开始广度遍历 privateintFirstVertex(intv){ if(v<0||v>(Vertex.length-1)) return-1; for(inti=0;i if(EdgeWeight[v][i]==1) returni; return-1; } //返回顶点v相对于w的下一个邻接顶点的索引,失败则返回-1 privateintNextVertex(intv,intw){ if(v<0||v>(Vertex.length-1)||w<0||w>(Vertex.length-1)) return-1; for(inti=w+1;i if(EdgeWeight[v][i]==1) returni; return-1; } publicvoidBFS(){ inthead=0; intrear=0; int[]queue=newint[Vertex.length];//辅组数组 //顶点访问标记 boolean[]visited=newboolean[Vertex.length]; for(inti=0;i visited[i]=false; System.out.println("BFS广度优先遍历: "); for(inti=0;i if(! visited[i]){ visited[i]=true; System.out.print(""+Vertex[i]); queue[rear++]=i; } while(head! =rear){ intj=queue[head++]; for(intk=FirstVertex(j);k>=0;k=NextVertex(j,k)){ //k是为访问的邻接顶点 if(! visited[k]){ visited[k]=true; System.out.print(""+Vertex[k]); queue[rear++]=k; } } } } } //图求度 publicvoidGetDegree(Graphg){ //无向图 if(GType==0){ intdegree=0; for(inti=0;i System.out.print("顶点"+Vertex[i]+"的度为: "); for(intj=0;j if(g.EdgeWeight[i][j]! =MaxValue){ degree++; } } System.out.print(degree); System.out.println(); degree=0; } } //有向图 else{ intindegree=0; intoutdegree=0; for(inti=0;i System.out.print("顶点"+Vertex[i]+"的出度为: "); for(intj=0;j if(g.EdgeWeight[i][j]! =MaxValue){ indegree++; } if(g.EdgeWeight[j][i]! =MaxValue){ outdegree++; } } System.out.print(indegree); System.out.print("入度为: "+outdegree+""); System.out.println(); indegree=0; outdegree=0; } } } } 测试编码: packagegraph; importjava.util.Scanner; publicclassGraphTest{ publicstaticvoidmain(String[]args){ Scannerscan=newScanner(System.in); Graphg=newGraph(); System.out.println("输出生成图的类型: "); g.GType=scan.nextInt();//图的种类 System.out.println("输入图的顶点数量: "); g.VertxNum=scan.nex
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 结构图 实现