package com.answer.tu;
public class ListUDG {
private class VNode{//表的顶点
private String data;//
private ENode firstEdge;//指向其第一个邻接点
}
private class ENode{//表的邻接点
private int tp;//邻接点在顶点数组中的索引
private ENode nextEdge;//该顶点的下一条弧的顶点
}
private VNode[] top;//顶点数组
public ListUDG(String[] vexs, String[][] edges){
int vlen=vexs.length;
int elen=edges.length;
top=new VNode[vlen];
for(int i=0;i<vlen;i++){
top[i]=new VNode();
top[i].data=vexs[i];
top[i].firstEdge=null;
}
for(int i=0;i<elen;i++){
int pos1=getPos(edges[i][0]);
int pos2=getPos(edges[i][1]);
ENode node1=new ENode();
node1.tp=pos2;
if(top[pos1].firstEdge==null){
top[pos1].firstEdge=node1;
}else {
linklast(top[pos1].firstEdge,node1);
}
ENode node2=new ENode();
node2.tp=pos1;
if(top[pos2].firstEdge==null){
top[pos2].firstEdge=node2;
}else {
linklast(top[pos2].firstEdge,node2);
}
}
}
private void linklast(ENode firstNode, ENode node1) {
while(firstNode.nextEdge!=null){
firstNode=firstNode.nextEdge;
}
firstNode.nextEdge=node1;
}
private int getPos(String s) {
for(int i=0;i<top.length;i++){
if(top[i].data.equals(s)){
return i;
}
}return -1;
}
public void print() {
System.out.printf("List Graph:\n");
for (int i = 0; i < top.length; i++) {
System.out.printf("%d(%s): ", i, top[i].data);
ENode node = top[i].firstEdge;
while (node != null) {
System.out.printf("%d(%s) ", node.tp, top[node.tp].data);
node = node.nextEdge;
}
System.out.printf("\n");
}
}
public static void main(String[] args) {
String[] vexs = {"V0", "V1", "V2", "V3"};
String[][] edges = new String[][]{
{"V0", "V1"},
{"V0", "V2"},
{"V0", "V3"},
{"V1", "V2"},
{"V3", "V2"}
};
ListUDG udg=new ListUDG(vexs,edges);
udg.print();
}
}