找了好久的关于图的邻接链表存储结构,这个是最满意的。一来方便自己以后查找使用,二来分享给大家。
package Graph;
import java.util.ArrayList;
import java.util.List;
/**
* 邻接表实现的图
* @author ctk
*
*/
public class ListGraph {
private List<GraphNode> gNodes ;//头结点链表
private int vertex ;//图的结点数目
private int edges ;//边数目
public ListGraph(int vertex){//构造方法
this.vertex = vertex ;
gNodes = new ArrayList<>(vertex);//给头结点链表分配内存空间
for(int i=0;i<vertex;i++)
{
GraphNode gnode = new GraphNode();
gnode.setNodeIndex(i);
gnode.setNext(null);
gNodes.add(gnode);
}
}
public void addEdge(int i,int j,int weight){//添加边
if(i >= vertex || j >= vertex || i < 0 || j < 0)
{
System.out.println("输入的i和j超过范围");
return;
}
GraphNode gnode = gNodes.get(i);
boolean isAlter = false;
while(gnode.getNext() != null)
{
if(gnode.getNodeIndex() == j)
{
gnode.setData(weight);
isAlter = true;
break;
}
gnode = gnode.getNext();
}
if(i == j){
gnode.setData(weight);
isAlter = true;
}
if(!isAlter){
GraphNode edgeNode = new GraphNode();
edgeNode.setData(weight);
edgeNode.setNodeIndex(j);
edgeNode.setNext(null);
gnode.setNext(edgeNode);
}
}
public int[][] getMartix(){//生成邻接矩阵,图以邻接矩阵的形式返回
int[][] martix = new int[vertex][vertex];
GraphNode temp = null;
for(int i=0;i<gNodes.size();i++){
temp = gNodes.get(i);
while(temp != null){
martix[i][temp.getNodeIndex()] = temp.getData();
temp = temp.getNext();
}
}
return martix;
}
public int getEdge(int i,int j){ //获得某边,获取某个边的权重
int weight = 0;
if(i >= vertex || j >= vertex || i < 0 || j < 0)
{
System.out.println("输入的i和j超过范围");
return weight;
}
GraphNode temp = gNodes.get(i);
while(temp != null){
if(temp.getNodeIndex() == j){
weight = temp.getData();
break;
}
temp = temp.getNext();
}
return weight;
}
public int getVertex() {//获取全图的顶点数
return vertex;
}
public int getEdges() {//返回全图的边数
return edges;
}
public static void main(String[] args) {
ListGraph graph = new ListGraph(5);
graph.addEdge(0, 1, 2);
graph.addEdge(0, 2, 3);
graph.addEdge(1, 1, 4);
graph.addEdge(2, 3, 6);
int[][] martix = graph.getMartix();
for(int i =0;i<martix.length;i++){
for(int j=0;j<martix[i].length;j++)
System.out.print(martix[i][j]+" ");
System.out.println();
}
System.out.println("获取边<1,1> :"+graph.getEdge(1, 1));
}
}
class GraphNode{//节点类
private int nodeIndex;//结点标号
private int data;//结点数据
private GraphNode next;//结点指针
public int getNodeIndex() {//返回顶点标号
return nodeIndex;
}
public void setNodeIndex(int nodeIndex) {//设置顶点标号
this.nodeIndex = nodeIndex;
}
public int getData() {//返回结点数据
return data;
}
public void setData(int data) {//设置结点数据
this.data = data;
}
public GraphNode getNext() {//获取该结点指向的下一个结点
return next;
}
public void setNext(GraphNode next) {//设置该结点指向的下一个结点
this.next = next;
}
}
借花献佛了。