邻接矩阵表示的带权有向图网演示程序.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;ifor(intj=0;jif(i==j)
Edge[i][j]=0;//对角线
else//非对角线上无穷大
Edge[i][j]=MaxValue;
CurrentEdges=0;//现有边数
CurrentVertices=0;//现有顶点数
}
//查找指定的顶点的序号
publicintFindVertex(charvertex){
//在顶点数组里面查找
for(inti=0;iif(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;colif(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;iVerticesList[i-1]=VerticesList[i];
//修改邻接矩阵
intk=0;//累计将要删去的边数
for(inti=0;iif(Edge[v][i]>0&&//自身
Edge[v][i]k++;//第v行
for(inti=0;iif(Edge[i][v]>0&&//自身
Edge[i][v]k++;//第v列
//覆盖第v行
intj;
for(inti=v+1;ifor(j=0;jEdge[i-1][j]=Edge[i][j];
//覆盖第v列
for(j=v+1;jfor(inti=0;iEdge[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;iSystem.out.print(VerticesList[i]+"");
System.out.println('\n'+"邻接矩阵");
for(i=0;ifor(j=0;jif(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方法结束
}//“邻接矩阵”类结束
(四)、程序的输入输出和运行结果截屏
运行结果如下图所示