邻接矩阵表示的带权有向图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习报告——“邻接矩阵表示的带权有向图”演示程序(一)、程序的功能和特点
主要实现的功能:1.使用邻接矩阵表示带权有向图;
2.查找指定顶点序号;
3.判断图是否为空;
4.判断图是否满;
5.取得顶点数、边数、一条边的权值;
6.插入一个顶点、边;
7.删除一个顶点、边;
(二)、程序的算法设计
“邻接矩阵的表示”算法:
1.【逻辑结构与存储结构设计】
逻辑结构:非线性结构——网状结构
存储结构:内存中连续的存储结构,邻接矩阵
2.【基本操作设计】
按指定输入,生成图并打印该图
删除一个顶点并打印
删除一条边并打印
3. 【算法设计】
插入一个顶点的算法:
首先判断该图是否已满,若已满:插入失败;
否则进行插入:1.顶点表增加一个元素
2.邻接矩阵增加一行一列
删除一个顶点的算法:
判断要删除顶点的存在性,若不存在:出错;
否则:1.修改顶点表,即在顶点数组中删除
该点;
2.修改邻接矩阵,即需要统计与该顶
点相关联的边,并将这些边也删除4.【高级语言代码】
public class Graph {
static int MaxEdges=50;
static int MaxVertices=10;
static int MaxValue=9999;//无穷大
//存放顶点的数组
private char VerticesList[]=new char[MaxVertices]; //邻接矩阵(存放两个顶点的权值)
private int Edge[][]=new int[MaxVertices][MaxVertices];
private int CurrentEdges;//现有边数
private int CurrentVertices;//现有顶点数
//构造函数:建立空的邻接矩阵
public Graph(){
for(int i=0;i for(int j=0;j if(i==j) Edge[i][j]=0;//对角线 else Edge[i][j]=MaxValue; CurrentEdges=0;//现有边数 CurrentVertices=0;//现有顶点数 } //取得一条边的权值 public int GetWeigh(int v1,int v2){ if(v1<0||v1>CurrentVertices-1) return -1;//用-1表示出错 if(v2<0||v2>CurrentVertices-1) return -1;//用-1表示出错 return Edge[v1][v2]; } //取得第一个邻接点的序号 public int GetFirstNeighbor(int v){ if(v<0||v>CurrentVertices-1) return -1; //邻接矩阵的行号和列号是两个邻接点的序号 for(int col=0;col return -1; } //插入一个顶点 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;//插入位置 } //插入一个边 public boolean InsertEdge(int v1,int v2,int weight){ if(v1<0||v1>CurrentVertices-1) return false;//出错 if(v2<0||v2>CurrentVertices-1) return false;//出错 Edge[v1][v2]=weight; return true; } //删除一个顶点 public boolean RemoveVertex(int v){ if(v<0||v>CurrentVertices-1) return false;//出错 //修改顶点表 for(int i=v+1;i //修改邻接矩阵 int k=0;//累计将要删去的边数 for(int i=0;i if(Edge[v][i]>0&&Edge[v][i] for(int i=0;i if(Edge[i][v]>0&&Edge[i][v] //覆盖第v行 int j; for(int i=v+1;i Edge[i-1][j]=Edge[i][j]; //覆盖第v列