“邻接矩阵表示的带权有向图(网)”演示程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
班级:信息1102 姓名:贾孟涛
========实习报告十四“邻接矩阵表示的带权有向图(网)”演示程序==========
(一)、程序的功能和特点
该程序可以建立有向图的带权邻接矩阵,能够对建立的邻接矩阵进行添加顶点,添加边和删除顶点,删除边的操作,并能显示输出邻接矩阵。该程序的特点是采用java面向对象语言,对边,顶点和邻接矩阵用类进行封装。采用链式存储结构。
(二)、程序的算法设计
算法一:“插入一个顶点”算法:
1.【逻辑结构与存储结构设计】
逻辑结构:线性结构。
存储结构:顺序存储与链式存储结合。
2.【基本操作设计】
文字说明:
创建新结点,找到结点L位置,在 L后插入新结点。
3.【算法设计】
文字说明:
(1).首先判断顶点表是否满。
(2).若满则插入失败,放回false。
(3).顶点表若不满,创建新顶点,将新顶点加入顶点表。
(4).插入顶点成功,返回true。
4.【高级语言代码】
//插入一个顶点
public int InsertVertex ( char vertex ){
if(IsGraphFull()) return -1; //插入失败
//顶点表增加一个元素
VerticesList[CurrentVertices]=vertex;
//邻接矩阵增加一行一列
for ( int j = 0;j <=CurrentVertices;j++ ) {
Edge[CurrentEdges][j]=MaxValue;
Edge[j][CurrentEdges]=MaxValue;
}
Edge[CurrentEdges][CurrentEdges]=0;
CurrentVertices++;
return CurrentVertices; //插入位置
}
算法二:“插入一条边”算法:
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.【高级语言代码】
//插入一个边
public boolean InsertEdge( int v1, int v2, double weight){ if (v1 < 0 || v1 > CurrentVertices - 1)
return false; //出错
if (v2 < 0 || v2 > CurrentVertices - 1)
return false;
Edge[v1][v2]=weight; //网,有向边
return true;
}
(三)、程序中类的设计
“Graph”类:
1.【逻辑结构与存储结构】
逻辑结构:网状结构。
存储结构:顺序存储与链式存储结合。
2.【主要成员变量说明】
static int MaxEdges = 50;
static int MaxVertices = 10;
static double MaxValue=9999.9; //无穷大
//存放顶点的数组
private char VerticesList[]=new char[MaxVertices];
//邻接矩阵(存放两个顶点权值)
private double Edge[][]=new double[MaxVertices][MaxVertices];
private int CurrentEdges; //现有边数
private int CurrentVertices; //现有顶点数
//构造函数:建立空的邻接矩阵
3.【主要成员方法说明】
public Graph ( ):为定义的构造函数,建立空的邻接矩阵。
public int FindVertex (char vertex):查找指定的顶点的序号
public boolean IsGraphEmpty ( ):判断图是否为空。
public boolean IsGraphFull ( ):判断图是否为满。
public char GetValue ( int i ):按顶点序号返回顶点数据。
public int NumberOfVertices ( ):返回图的顶点数。
public int NumberOfEdges ( ):返回图的边数。
public double GetWeight ( int v1, int v2 ):取得一条边的权值。
public int GetFirstNeighbor ( int v ):取得第一个邻接点的序号
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.【高级语言代码】
// “邻接矩阵”类
class Graph {
static int MaxEdges = 50;
static int MaxVertices = 10;
static double MaxValue=9999.9; //无穷大
//存放顶点的数组
private char VerticesList[]=new char[MaxVertices];
//邻接矩阵(存放两个顶点权值)
private double Edge[][]=new double[MaxVertices][MaxVertices];
private int CurrentEdges; //现有边数
private int CurrentVertices; //现有顶点数
//构造函数:建立空的邻接矩阵
public Graph ( ){
for ( int i = 0; i < MaxVertices; i++ )
for ( int j = 0; j < MaxVertices; j++ )
if(i==j)
Edge[i][j] = 0; //对角线
else //非对角线上无穷大
Edge[i][j] =MaxValue;