邻接矩阵表示的带权有向图网演示程序.docx
- 文档编号:24482862
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:12
- 大小:40.73KB
邻接矩阵表示的带权有向图网演示程序.docx
《邻接矩阵表示的带权有向图网演示程序.docx》由会员分享,可在线阅读,更多相关《邻接矩阵表示的带权有向图网演示程序.docx(12页珍藏版)》请在冰豆网上搜索。
邻接矩阵表示的带权有向图网演示程序
班级:
信息1102XX:
贾孟涛
========实习报告十四“邻接矩阵表示的带权有向图(网)”演示程序==========
(一)、程序的功能和特点
该程序可以建立有向图的带权邻接矩阵,能够对建立的邻接矩阵进行添加顶点,添加边和删除顶点,删除边的操作,并能显示输出邻接矩阵。
该程序的特点是采用java面向对象语言,对边,顶点和邻接矩阵用类进行封装。
采用链式存储结构。
(二)、程序的算法设计
算法一:
“插入一个顶点”算法:
1.【逻辑结构与存储结构设计】
逻辑结构:
线性结构。
存储结构:
顺序存储与链式存储结合。
2.【基本操作设计】
文字说明:
创建新结点,找到结点L位置,在 L后插入新结点。
3.【算法设计】
文字说明:
(1).首先判断顶点表是否满。
(2).若满则插入失败,放回false。
(3).顶点表若不满,创建新顶点,将新顶点加入顶点表。
(4).插入顶点成功,返回true。
4.【高级语言代码】
//插入一个顶点
publicintInsertVertex(charvertex){
if(IsGraphFull())return-1;//插入失败
//顶点表增加一个元素
VerticesList[CurrentVertices]=vertex;
//邻接矩阵增加一行一列
for(intj=0;j<=CurrentVertices;j++){
Edge[CurrentEdges][j]=MaxValue;
Edge[j][CurrentEdges]=MaxValue;
}
Edge[CurrentEdges][CurrentEdges]=0;
CurrentVertices++;
returnCurrentVertices;//插入位置
}
算法二:
“插入一条边”算法:
1.【逻辑结构与存储结构设计】
逻辑结构:
线性结构。
存储结构:
链式存储结构。
3.【基本操作设计】
文字说明:
创建新边结点,再将新创建的边结点插入图中。
4.【算法设计】
文字说明:
(1).首先判断插入边上的两个顶点编号是否越界。
if(v1<0||v1>CurrentVertices-1) return false;
if(v2<0||v2>CurrentVertices-1) return false;
(2).如果越界则插入失败,返回false。
(3).否则创建新边结点
(4).再将新创建的边结点插入图中
(5).插入成功返回true。
4.【高级语言代码】
//插入一个边
publicbooleanInsertEdge(intv1,intv2,doubleweight){
if(v1<0||v1>CurrentVertices-1)
returnfalse;//出错
if(v2<0||v2>CurrentVertices-1)
returnfalse;
Edge[v1][v2]=weight;//网,有向边
returntrue;
}
(三)、程序中类的设计
“Graph”类:
1.【逻辑结构与存储结构】
逻辑结构:
网状结构。
存储结构:
顺序存储与链式存储结合。
2.【主要成员变量说明】
staticintMaxEdges=50;
staticintMaxVertices=10;
staticdoubleMaxValue=9999.9;//无穷大
//存放顶点的数组
privatecharVerticesList[]=newchar[MaxVertices];
//邻接矩阵(存放两个顶点权值)
privatedoubleEdge[][]=newdouble[MaxVertices][MaxVertices];
privateintCurrentEdges;//现有边数
privateintCurrentVertices;//现有顶点数
//构造函数:
建立空的邻接矩阵
3.【主要成员方法说明】
publicGraph():
为定义的构造函数,建立空的邻接矩阵。
publicintFindVertex(charvertex):
查找指定的顶点的序号
publicbooleanIsGraphEmpty():
判断图是否为空。
public boolean IsGraphFull ( ):
判断图是否为满。
public char GetValue ( int i ):
按顶点序号返回顶点数据。
public int NumberOfVertices ( ):
返回图的顶点数。
public int NumberOfEdges ( ):
返回图的边数。
publicdoubleGetWeight(intv1,intv2):
取得一条边的权值。
publicintGetFirstNeighbor(intv):
取得第一个邻接点的序号
public int InsertVertex ( char vertex ):
插入一个顶点。
public boolean RemoveVertex ( int v ):
删除一个顶点。
public boolean InsertEdge ( int v1,int v2,double weight ):
插入一条边。
public boolean RemoveEdge ( int v1, int v2 ):
删除一条边。
public void display():
显示邻接矩阵。
4.【高级语言代码】
//“邻接矩阵”类
classGraph{
staticintMaxEdges=50;
staticintMaxVertices=10;
staticdoubleMaxValue=9999.9;//无穷大
//存放顶点的数组
privatecharVerticesList[]=newchar[MaxVertices];
//邻接矩阵(存放两个顶点权值)
privatedoubleEdge[][]=newdouble[MaxVertices][MaxVertices];
privateintCurrentEdges;//现有边数
privateintCurrentVertices;//现有顶点数
//构造函数:
建立空的邻接矩阵
publicGraph(){
for(inti=0;i for(intj=0;j if(i==j) Edge[i][j]=0;//对角线 else//非对角线上无穷大 Edge[i][j]=MaxValue; CurrentEdges=0;//现有边数 CurrentVertices=0;//现有顶点数 } //查找指定的顶点的序号 publicintFindVertex(charvertex){ //在顶点数组里面查找 for(inti=0;i if(VerticesList[i]==vertex) returni;//返回下标 return-1;//没有找到 } //图空否? publicbooleanIsGraphEmpty(){ returnCurrentVertices==0; } //图满否? publicbooleanIsGraphFull(){ returnCurrentVertices==MaxVertices|| CurrentEdges==MaxEdges; } //取得顶点数 publicintNumberOfVertices(){ returnCurrentVertices; } //取得边数 publicintNumberOfEdges(){ returnCurrentEdges; } //按序号取得顶点值 publiccharGetValue(inti){ returni>=0&&i<=CurrentVertices-1 ? VerticesList[i]: ''; } //取得一条边的权值 publicdoubleGetWeight(intv1,intv2){ if(v1<0||v1>CurrentVertices-1) return-1.0;//用-1表示出错 if(v2<0||v2>CurrentVertices-1) return-1.0; returnEdge[v1][v2]; } //取得第一个邻接点的序号 publicintGetFirstNeighbor(intv){ if(v<0||v>CurrentVertices-1) return-1;//用-1表示出错 //邻接矩阵的行号和列号是两个邻接点的序号 for(intcol=0;col if(Edge[v][col]>0&&//自身 Edge[v][col] returncol; return-1;//无邻接点 } //插入一个顶点 publicintInsertVertex(charvertex){ if(IsGraphFull())return-1;//插入失败 //顶点表增加一个元素 VerticesList[CurrentVertices]=vertex; //邻接矩阵增加一行一列 for(intj=0;j<=CurrentVertices;j++){ Edge[CurrentEdges][j]=MaxValue; Edge[j][CurrentEdges]=MaxValue; } Edge[CurrentEdges][CurrentEdges]=0; CurrentVertices++; returnCurrentVertices;//插入位置 } //插入一个边 publicbooleanInsertEdge(intv1,intv2,doubleweight){ if(v1<0||v1>CurrentVertices-1) returnfalse;//出错 if(v2<0||v2>CurrentVertices-1) returnfalse; Edge[v1][v2]=weight;//网,有向边 returntrue; } //删除一个顶点 publicbooleanRemoveVertex(intv){ if(v<0||v>CurrentVertices-1) returnfalse;//出错 //修改顶点表 for(inti=v+1;i VerticesList[i-1]=VerticesList[i]; //修改邻接矩阵 intk=0;//累计将要删去的边数 for(inti=0;i if(Edge[v][i]>0&&//自身 Edge[v][i] k++;//第v行 for(inti=0;i if(Edge[i][v]>0&&//自身 Edge[i][v] k++;//第v列 //覆盖第v行 intj; for(inti=v+1;i for(j=0;j Edge[i-1][j]=Edge[i][j]; //覆盖第v列 for(j=v+1;j for(inti=0;i Edge[i][j-1]=Edge[i][j]; CurrentVertices--;//修改顶点数 CurrentEdges-=k;//修改边数 returntrue; } //删除一个边 publicbooleanRemoveEdge(intv1,intv2){ if(v1<0||v1>CurrentVertices-1) returnfalse;//用-1表示出错 if(v2<0||v2>CurrentVertices-1) returnfalse; if(v1==v2)returnfalse; Edge[v1][v2]=MaxValue;//网,无路径 returntrue; } //打印邻接矩阵 publicvoiddisplay(){ inti,j; System.out.println("顶点表"); for(i=0;i System.out.print(VerticesList[i]+""); System.out.println('\n'+"邻接矩阵"); for(i=0;i for(j=0;j if(Edge[i][j]==MaxValue) System.out.print(''+""); else System.out.print(Edge[i][j]+""); System.out.println(); } } //主函数 publicstaticvoidmain(String[]args){ GraphG=newGraph();//邻接矩阵 //准备有向图(网)数据 charc[]={'A','B','C','D','E','F'};//顶点 intv[][]={//弧 {0,1},{0,3},{1,2},{2,3},{4,5}, {1,3},{2,4},{3,5},{4,3},{2,5} }; doublee[]={2.3,3.6,6.5,2.5,1.7, 0.8,7.2,9.1,5.2,1.3};//权 //插入顶点 for(inti=0;i<6;i++) G.InsertVertex(c[i]); //插入弧 for(inti=0;i<10;i++) G.InsertEdge(v[i][0],v[i][1],e[i]); //打印输出 G.display(); //删除一个顶点 G.RemoveVertex(3); G.display(); //删除一条边 G.RemoveEdge(2,4); G.display(); }//main方法结束 }//“邻接矩阵”类结束 (四)、程序的输入输出和运行结果截屏 运行结果如下图所示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 邻接矩阵 表示 带权有 演示 程序