邻接矩阵表示的带权有向图网演示程序.docx

上传人:b****2 文档编号:24482862 上传时间:2023-05-28 格式:DOCX 页数:12 大小:40.73KB
下载 相关 举报
邻接矩阵表示的带权有向图网演示程序.docx_第1页
第1页 / 共12页
邻接矩阵表示的带权有向图网演示程序.docx_第2页
第2页 / 共12页
邻接矩阵表示的带权有向图网演示程序.docx_第3页
第3页 / 共12页
邻接矩阵表示的带权有向图网演示程序.docx_第4页
第4页 / 共12页
邻接矩阵表示的带权有向图网演示程序.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

邻接矩阵表示的带权有向图网演示程序.docx

《邻接矩阵表示的带权有向图网演示程序.docx》由会员分享,可在线阅读,更多相关《邻接矩阵表示的带权有向图网演示程序.docx(12页珍藏版)》请在冰豆网上搜索。

邻接矩阵表示的带权有向图网演示程序.docx

邻接矩阵表示的带权有向图网演示程序

班级:

信息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方法结束

}//“邻接矩阵”类结束

(四)、程序的输入输出和运行结果截屏

运行结果如下图所示

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1