一:邻接矩阵储存
对于图中的n个顶点采用顺序存储,任意两个顶点之间是否有边,则用一个NxN的矩阵来表示。规定矩阵的元素为:
Aij=1(若点Vi和Vj之间有边,若是网图,Aij=权值),Aij=0(若点Vi和Vj没边)
图的定义:
class Graph{
char vexs[]=new char[10];//顶点表
int edges[][]=new int[10][10];//邻接矩阵
int Vnum;//定点数
int Enum;//边数
}
建立一个有向图G的临界矩阵存储:
Graph CreatMGraph(){
Graph graph = null;
Scanner scanner=new Scanner(System.in);
System.out.println("请输入顶点数和边数");
graph.Vnum=scanner.nextInt();
graph.Enum=scanner.nextInt();
for (int i = 0; i < graph.Vnum; i++) {
graph.vexs[i]=scanner.next().charAt(0);//输入顶点信息
}
for (int i = 0; i < graph.Enum; i++) {
int x,y;
x=scanner.nextInt();
y=scanner.nextInt();
graph.edges[x][y]=1;//输入边的信息,把邻接矩阵的对应边设置为1
//graph.edges[y][x]=1;//若是无向图,则还要加上反向的边
}
return graph;
}
二:邻接表储存
邻接表储存是图的顺序存储与链式存储结合的存储方法。
每一条边存储一个节点,把某个顶点Vi所有的邻接边链接成一个单链表,
将该单链表的头指针和这个顶点的信息作为顶点结点依次存储起来,就构成了图的邻接表。
在邻接表中有两种结构
一种是顶点节点的结构,它由顶点域和指向第一条邻接边的指针域构成;另一种是边结点结构,它由临街点域和指向下一条邻接边的指针域构成
类的定义:
class ALGraph{
VNode List[]=new VNode[10];//建立邻接表
int Vnum,Enum;//顶点数和边数
}
class VNode{
char vertex;//顶点域
boolean isReaded;//判断是否被遍历过
ENode next;//指向下一个结点的指针
}
class ENode{
int adjvex;//结点在邻接表中的下标
boolean isReaded;//判断是否被遍历过
ENode next;//指向下一个结点的指针
}
建立有向图的邻接表储存:
ALGraph creatAlGraph(){
ALGraph graph=null;
//建立有向图的邻接表存储
System.out.println("请输入顶点数和边数:");
Scanner scanner=new Scanner(System.in);
graph.Vnum=scanner.nextInt();
graph.Enum=scanner.nextInt();
for (int i = 0; i < graph.Vnum; i++) {//建立顶点表
graph.List[i].vertex=scanner.next().charAt(0);//读入一个字符放到顶点表的对应位置
graph.List[i].isReaded=false;
graph.List[i].next=null;
}
for (int i = 0; i < graph.Enum; i++) {
ENode eNode=new ENode();
int x;
x=scanner.nextInt();
eNode.adjvex=scanner.nextInt();
eNode.next=graph.List[x].next;
graph.List[x].next=eNode;
}
return graph;
}