邻接表
由于邻接矩阵对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的
所以,考虑另外一种存储结构方式,用单链表存储每个顶点vi的所有邻接点,一维数组还是存储各个顶点。
这种数组与链表相结合的存储方法称为邻接表。
例如:
带权值的网图:
邻接表表示为:
Java实现:
顶点类
package DataStructure.Graph.AL;
public class VertexNode {
String data;
EdgeNode firstedge;
}
边类
package DataStructure.Graph.AL;
public class EdgeNode {
String adjvex;
int weight;
EdgeNode next;
}
图类
package DataStructure.Graph.AL;
import java.util.Scanner;
public class Graph {
int numVertexes;
int numEdges;
VertexNode[] vertex;
Graph(){
Scanner in = new Scanner(System.in);
System.out.println("输入顶点数和边数:");
numVertexes = in.nextInt();
numEdges = in.nextInt();
vertex = new VertexNode[numVertexes];
System.out.println("请输入各个顶点的名称:");
for(int i = 0; i < numVertexes; i++){
VertexNode vertexNode = new VertexNode();
vertexNode.data = in.next();
vertexNode.firstedge = null;
vertex[i] = vertexNode;
}
System.out.println("请输入各弧<vi,vj>及其权值:");
for(int j = 0; j < numEdges; j++){
EdgeNode edgeNode = new EdgeNode();
String tailVertexName = in.next();
String headVertexName = in.next();
edgeNode.weight = in.nextInt();
VertexNode tailVertex = getVertex(tailVertexName);
VertexNode headVertex = getVertex(headVertexName);
if(headVertex == null || tailVertex == null) {
System.out.println("输入错误!(输入了不存在的顶点)");
j--;
continue;
}
//建立边表
edgeNode.adjvex = headVertexName;
edgeNode.next = tailVertex.firstedge;
tailVertex.firstedge = edgeNode;
}
}
//获取顶点
public VertexNode getVertex(String vertexName){
for(int i = 0; i < numVertexes; i++) {
if (vertex[i].data.equals(vertexName))
return vertex[i];
}
return null;
}
}
测试类:
package DataStructure.Graph.AL;
public class TestALGraph {
public static void main(String[] args) {
Graph graph = new Graph();
System.out.println("该图的邻接表为: ");
showGraph(graph);
}
public static void showGraph(Graph graph){
for(int i = 0; i < graph.numVertexes; i++){
VertexNode vertexNode = graph.vertex[i];
System.out.print(vertexNode.data);
EdgeNode current = vertexNode.firstedge;
while (current != null){
System.out.print("--" + current.weight + "--->" + current.adjvex );
current = current.next;
}
System.out.println();
}
}
}
运行结果:
输入错误时: