当前位置:文档之家› 邻接表表示的带权有向图(网)

邻接表表示的带权有向图(网)

===实习报告一“邻接表表示的带权有向图(网)”演示程序===(一)、程序的功能和特点1. 程序功能:建立有向图的带权邻接表,能够对建立的邻接表进行添加顶点,添加边和删除顶点,删除边的操作,并能显示输出邻接表。

2. 程序特点:采用java面向对象语言,对边,顶点和邻接表用类进行封装。

采用链式存储结构。

(二八程序的算法设计算法一:“插入一个顶点”算法:1. 【逻辑结构与存储结构设计】逻辑结构:线性结构。

存储结构:顺序存储与链式存储结合。

邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法。

邻接表表示法类似于树的孩子链表表示法。

就是对于图G中的每个顶点vi,将所有邻接于vi的顶点vj链成一个单链表,这个单链表就称为顶点vi的邻接表,再将所有点的邻接表表头放到数组中,就构成了图的邻接表。

如下图就是一个临界表的存储图。

vertex firstedgeadjvex n ext序号vertex firstedge图的邻接表表示在邻接表表示中有两种结点结构,如图所示。

邻接矩阵表示的结点结构顶点域边指针流程示意图:顶点数据组成的数组顶点数组表的顺序存储: V0 V1— V2—O2.【基本操作设计】文字说明: (1) .首先判断顶点表是否满。

(2) .若满则插入失败,放回false 。

(3) .顶点表若不满,创建新顶点,将新顶点加入顶点表 (4) .插入顶点成功,返回true 。

添加顶点前状态添加顶点v2后 网图的边表结构//插入一个顶点public boolea n In sertVertex ( char vertex ){ if (NumVertices==MaxVertices ) return false ; // 顶点表满Vertex t= n ewVertex();t. data =vertex;t. adj =null ;NodeTable[ NumVertices ]=t;NumVertices++;//注明:企图以下赋值不合Java 语法〃NodeTable[NumVertices].data=vertex;〃NodeTable[NumVertices].adj=null; return true ;}算法二:“插入一条边”算法:1. 【逻辑结构与存储结构设计】逻辑结构:线性结构。

存储结构:链式存储结构网图的边表结构如图所示。

邻接点域4.【高级语言代码】2. 【基本操作设计】基本操作:3. 【算法设计】文字说明:(1).首先判断插入边上的两个顶点编号是否越界。

if (v1>= NumVertices ||v1<0) return false ;if (v2>= NumVertices ||v2<0) return false ;(2).如果越界则插入失败,返回false。

(3).否则创建新边结点,以v2顶点和该边上的权创建新边结点(4).再将新创建的边结点连接到v1顶点的单链表后面。

(5).插入成功返回true。

4. 【高级语言代码】//插入一条边public boolean InsertEdge ( int v1, int v2, double weight ){ if (v1>= NumVertices ||v1<0)return false ;if (v2>= NumVertices ||v2<0) return false ;//生成一个边结点,并赋值Edge E=n ewEdge(v2,weight);//链接在以v1为起点的单链表的最后Edge p=NodeTable[v1]. adj;//插入第一个边结点if ( p== null ) NodeTable[v1]. adj =E; else { //插入其它边结点while (p. link !=null ) p=p. link ;p. link =E;}NumEdges+; //当前顶点数return true ;} return true ;}(三八程序中类的设计“ Edge” 类:1. I逻辑结构与存储结构】逻辑结构:线性结构。

存储结构:链式存储结构在邻接表表示中边结点结构,如图所示。

边表邻接矩阵表示的边的结构2. 【主要成员变量说明】主要成员变量有:int dest;表示邻接点下标。

double cost ;表示边上的权值Edge link ; 表示下一边链接指针3. 【主要成员方法说明】lin k(i nt iD,double fD) 为结点类有两个参数的构造函数void lin kDisplay() 显示结点自身的数据域。

4. 【高级语言代码】//边结点类class Edge {int dest; //邻接点下标double cost; //边上的权值//下一边链接指针Edge link ;//构造函数:生成边结点Edge ( int D, double C ){dest =D;cost =C; link =null ;}};“ Vertex ”类:1. I逻辑结构与存储结构】逻辑结构:线性结构。

存储结构:链式存储结构在邻接表表示中顶点结构,如图所示。

2. 【主要成员变量说明】主要成员变量为:char data;顶点的数据域。

Edge adj ;边链表头指针。

3. 【主要成员方法说明】该类有默认的构造方法。

4. 【高级语言代码】//顶点类class Vertex {char data ; //顶点数据Edge adj; //边链表头指针};“ GraphAdj ” 类:4.【逻辑结构与存储结构】逻辑结构:线性结构。

存储结构:顺序存储与链式存储结合邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法。

序号vertex firstedge图的邻接表表示5. 【主要成员变量说明】主要成员变量为:static int DefaultSize = 20; 静态缺省数据大小。

private Vertex NodeTable[]; 顶点表数组。

private int NumVertices ; 当前顶点个数。

private int MaxVertices ; 最大顶点个数。

private int NumEdge;s 当前边数。

6. 【主要成员方法说明】public GraphAdj ( int vn, char v[], int en, int e[][], double w[]) :为定义的构造函数,建立图的邻接表。

public boolean GraphEmpty ( ) :判断图是否为空。

public boolean GraphFull ( ) :判断图是否为满。

public char GetValue ( int i ) :按顶点序号返回顶点数据。

public int NumberOfVertices ( ) :返回图的顶点数。

public int NumberOfEdges ( ) :返回图的边数。

public boolean 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 GraphAdj {static int DefaultSize = 20;private Vertex NodeTable[]; // 顶点表private int NumVertices ; // 当前顶点个数private int MaxVertices ; // 最大顶点个数private int NumEdge;s // 当前边数// 构造函建立图的邻接表public GraphAdj ( int vn, char v[], int en,int e[][], double w[]){// 形参:顶点数顶点数组边数边结点数组权数组int i;NumVertices =0; // 当前顶点数NumEdge=s0; // 当前边数// 确定顶点表空间MaxVertices =vn>DefaultSize ?vn: DefaultSize ;NodeTable = // 创建顶点表newVertex[ MaxVertices ];// 输入顶点for ( i = 0; i < vn; i++)InsertVertex ( v[i]);//输入边。

e为en行2列的数组e[en][2]for ( i = 0; i < en; i++)In sertEdge ( e[i][0], e[i][1], w[i]);}public boolean GraphEmpty ( ){ // 图空否?retur n NumVertices == 0;}public boolean GraphFull ( ){ // 图满否?return NumVertices == MaxVertices ;}//按顶点序号返回顶点数据public char GetValue ( int i ){return i >= 0 && i < NumVertices ? NodeTable[i]. data :'';}//返回图的顶点数public int NumberOfVertices ( ){return NumVertices;}//返回图的边数public int NumberOfEdges ( ){retur n NumEdges}//插入一个顶点public boolea n In sertVertex ( char vertex ){ if (NumVertices ==MaxVertices ) return false ; // 顶点表满Vertex t= n ewVertex();t. data =vertex;t. adj =null ;NodeTable[ NumVertices ]=t;NumVertices++;//注明:企图以下赋值不合Java语法//NodeTable[NumVertices].data=vertex;//NodeTable[NumVertices].adj=null;return true ;}//删除一个顶点public boolean RemoveVertex ( int v ){//当前顶点数NumVerticesif (v>= NumVertices ||v<0)return false ;//删除边链表NodeTable[v]. adj =null ;for (int k=0;k< NumVertices ;k++){//如果有指向V的边,则需删除Edge p=NodeTable[k]. adj ;Edge q=p;while (p!= null ) {if (p. dest ==v){if (q==p) //删第一个边结点NodeTable[k]. adj =p. link ;else //删后面的边结点q. link =p. link ;} q=p;p=p. link ;}}//从顶点表中删除for (int i=v+1;i< NumVertices ;i++)NodeTable[i-1]= NodeTable[i];NumVertices--;for (int j=0;j< NumVertices-1;j++){//如果有以V以后的点为终点的点,贝UEdge p=NodeTable[j]. adj ;//邻接表中的dest属性应减1if (p!= null ){//防止在添加顶点之后由于NumVertices加1//而导致空指针异常if (p. dest >v){p. dest =p. dest-1;}while (p. link !=null ){ p=p. link ;if (p. dest >v){p. dest =p. dest-1;}}}} //结束循环for jreturn true ;}//插入一条边public boolean InsertEdge ( int v1, int v2, double weight ){ if (v1>= NumVertices ||v1<0)return false ;if (v2>= NumVertices ||v2<0) return false ;//生成一个边结点,并赋值Edge E=n ewEdge(v2,weight);//链接在以v1为起点的单链表的最后Edge p=NodeTable[v 1 ]. adj ;// 插入第一个边结点if ( p== null ) NodeTable[v1]. adj =E;else { // 插入其它边结点while (p. link != null ) p=p. link ;p. link =E;}NumEdge+s+; // 当前顶点数return true ;}// 删除一条边public boolean RemoveEdge ( int v1, int v2 ){if (v 1 >= NumVertices ||v1<0)return false ;if (v2>= NumVertices ||v2<0)return false ;//从第v1条单链表向后查找Edge p=NodeTable[v 1 ]. adj ;Edge q=p;while (p!= null ) {if (p. dest ==v2){if (q==p) // 删第一个边结点NodeTable[v1]. adj =p. link ;else // 删后面的边结点q. link =p. link ; return true ;}q=p;p=p. link ;}return false ;}// 显示邻接表public void display(){Edge p;System. out .println( "邻接表");for ( int i = 0; i < NumVertices ; i++ ) {System. out .println( NodeTable[i]. data ); // 顶点p = NodeTable[i]. adj ; // 打印第i 条链表while (p!= null ) { System.out .print(p. dest +" " +p. cost +" " ); p=p. link ;}System. out .println();}// 主函数public static void main(String args[]){// 准备有向图(网)数据char c[]={ 'A' , 'B' ,'C' ,'D' , 'E' , 'F' }; // 顶点int e[][]={ // 弧{0,1},{0,3},{1,2},{2,3},{4,5}, {1,3},{2,4},{3,5},{4,3},{2,5} };double w[]={2.3,3.6,6.5,2.5,1.7,0.8,7.2,9.1,5.2,1.3}; // 权// 实参:顶点数顶点数组边数边结点数组权数组GraphAdjG=newGraphAdj(6,c,10,e,w); // 邻接矩阵G.display( );// 删除顶点//G.RemoveVertex(2);//G.display( );// 删除一条边//G.RemoveEdge(1,2);//G.display( );}} // 邻接表类结束(四)、程序的输入输出和运行结果截屏程序运行结果截屏:。

相关主题