1.首先要明白邻接表的存储结构
顶点集合(数组存储) 与顶点相连的其他顶点(链表存储)
v0 -> v2->v3->v1
v1 ->v2->v0
v2 ->v0->v3->v1
v3 ->v0->v2
2.顶点与边的数据结构
顶点的数据结构
public class VertexNode {
private String data; //存放顶点结点信息 比如名称
private EdgeNode firstEdge; //指向与该结点相连的 顶点集合 的第一个结点
//为了简洁,省略get,set方法
}边的数据结构
public class EdgeNode {
private int adjvex; //存放该顶点在顶点列表中的下标(位置)
private int weight; //权值 对于非网图可以不需要 所谓网图:就是带权的图
private EdgeNode next; //下一个邻接点
//省略get,set方法
}
图的数据结构
public class AdjacentTable {
private static final int MAX_SIZE = 100; //能存放的最大顶点数
private VertexNode[] vertexNodes = new VertexNode[MAX_SIZE]; //存放顶点的数组
private int vertexNum; //顶点数 不能超过能存放顶点数的最大值
private int edgeNum; //边数 不能超过无向图的最大边数 即 n(n-1)/2 n为顶点数//省略get,set方法
}
3.实现与测试
/**
* 测试:
* 创建一个无向图 顶点集(v0,v1,v2,v3,v4) 边集{(v0,v1),(v1,v2),(v2,v3),(v3,v0),(v0,v2)}
* 与顶点相关的其他结点插入的方法:头插法 比如 v0->v1 想插入v2 ,v3 1)v0->v2-v1 2)v0->v3->v2-v1
* vo是边的起始点,也是每个链表的头结点
*/
public class GraphApplication {
public static void main(String[] args){
AdjacentTable g = createGraph();
traverseGraph(g);
}
private static AdjacentTable createGraph(){
AdjacentTable graph = new AdjacentTable();
System.out.println("输入顶点数:");
Scanner sc = new Scanner(System.in);
int vertexNum = sc.nextInt();
System.out.println("输入边数(边数不能超过无向图的最大边数):");
int edgeNum = sc.nextInt();
graph.setVertexNum(vertexNum);
graph.setEdgeNum(edgeNum);
//初始化顶点数组
for(int i = 0; i < vertexNum; i++){
VertexNode v = new VertexNode();
v.setData("v" + i); //此处直接赋 v0 v1 ...值
graph.getVertexNodes()[i] = v;
}
//将各个顶点与边集进行连接
VertexNode[] vertexNodes = graph.getVertexNodes();
for(int i = 0; i < edgeNum; i++){
System.out.println("输入边(vi,vj)的起点");
int start = sc.nextInt();
System.out.println("输入边(vi,vj)的终点");
int end = sc.nextInt();
//以头插法的方式插入到链表中
EdgeNode edgeNodei = new EdgeNode();
edgeNodei.setAdjvex(end);
edgeNodei.setNext(vertexNodes[start].getFirstEdge());
vertexNodes[start].setFirstEdge(edgeNodei);
//因为是无向图 vi到vj有边 那么 vj到vi也有边
EdgeNode edgeNodej = new EdgeNode();
edgeNodej.setAdjvex(start);
edgeNodej.setNext(vertexNodes[end].getFirstEdge());
vertexNodes[end].setFirstEdge(edgeNodej);
}
return graph;
}
public static void traverseGraph(AdjacentTable g){
for(int i = 0; i < g.getVertexNodes().length; i++){
if(g.getVertexNodes()[i] != null){
System.out.print("顶点" + g.getVertexNodes()[i].getData() + " : "); //输出该顶点信息
EdgeNode node = g.getVertexNodes()[i].getFirstEdge();
while(node != null){
System.out.print(g.getVertexNodes()[node.getAdjvex()].getData() + "-->"); //输出边集结点信息
node = node.getNext();
}
System.out.println();
}
}
}
}
4.输出结果
按边的顺序进行输入(v0,v1),(v1,v2),(v2,v3),(v3,v0),(v0,v2)
顶点:v0 : v2-->v3-->v1-->
顶点:v1 : v2-->v0-->
顶点:v2 : v0-->v3-->v1-->
顶点:v3 : v0-->v2-->
突然发现,java的hash表好像就是用的邻接表,你们看是不是很像,顶点使用数组存储,与顶点相连的其他顶点用链表关联
版权声明:本文为xindanding原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。