使用Java实现十字链表数据结构
存在着3个自定义类——Graph2、Data2、Vertex2,Graph用于定义图,Data2用于表示顶点节点的Struct,Vertex用于表示弧节点的Struct,定义同教材。
文件1-Graph2.java
package orthogonallist;
public class Graph2 {
//自定义图,可存储50个节点
Data2[] dianArray = new Data2[50];
//记录定点数和边数
int verNum=0;
int edgeNum=0;
}
文件2-Data2.java
package orthogonallist;
public class Data2{
//元素,首弧
String data; //顶点名
Vertex2 inArc,outArc; //入弧与出弧
}
文件3-Vertex2.java
package orthogonallist;
public class Vertex2{
//弧头元素,弧尾元素,同弧头指针,同弧尾指针
String vh,vt; //VertexHead VertexTail
Vertex2 SimilarHeadVer,SimilarTailVer;
//int info; //权值
}
文件4-OLtest.java
package orthogonallist;
import java.util.Scanner;
public class OLtest {
public Data2 getVertex(Graph2 graph, String str) {
for (int i = 0; i < graph.verNum; i++) {
if (graph.dianArray[i].data.equals(str)) {
return graph.dianArray[i];
}
}
return null;
}
public void initialGraph(Graph2 graph) {
// 初始化十字链表
Scanner scan = new Scanner(System.in);
System.out.println("请输入顶点数和边数:");
try {
graph.verNum = scan.nextInt();
graph.edgeNum = scan.nextInt();
} catch (Exception e) {
System.out.println(e);
return;
}
System.out.println("请依次输入顶点名称:");
for (int i = 0; i < graph.verNum; i++) {
String name = scan.next();
Data2 dian = new Data2();
dian.data = name;
dian.inArc = null;
dian.outArc = null;
graph.dianArray[i] = dian;
}
System.out.println("请依次输入图的边:(格式为 ‘a b’ 表示存在边 a—>b )");
for (int i = 0; i < graph.edgeNum; i++) {
String preV = scan.next();
String folV = scan.next();
Data2 d1 = getVertex(graph, preV);
Vertex2 current = new Vertex2();// 当指针用,记录当前寻找到到最后的弧节点
if (d1 == null) {
System.out.println("输入边存在图中没有的顶点!");
return;
} else {
Vertex2 v2 = new Vertex2();
v2.vh = folV;
v2.vt = preV;
if (d1.outArc == null) {
d1.outArc = v2;
v2.SimilarTailVer = null;
v2.SimilarHeadVer = null;
} else {
current = d1.outArc;
while (current != null) {
if(current.SimilarTailVer == null)
break;
current = current.SimilarTailVer;
}
current.SimilarTailVer = v2;
v2.SimilarTailVer = null;
v2.SimilarHeadVer = null;
current = v2;//方便设置弧头调用当前的Vertex
}
}
Data2 d2 = getVertex(graph, folV);
if (d2 == null) {
System.out.println("输入边存在图中没有的顶点!");
return;
} else {
if (d2.inArc == null)
d2.inArc = current;
else {
Vertex2 v2 = new Vertex2();
v2 = d2.inArc;
while (v2.SimilarHeadVer != null) {
v2 = v2.SimilarHeadVer;
}
v2.SimilarHeadVer = current;
}
}
}
}
public void outputGraph(Graph2 graph) {
// 输出十字链表
//直接通过SimilarHeadVer与SimilarTailVer不断追查即可
System.out.println("输出图的十字链表为:");
for (int i = 0; i < graph.verNum; i++) {
Data2 dt = graph.dianArray[i];
System.out.print(dt.data);
Vertex2 current = dt.outArc;
while (current != null) {
System.out.print("->" + current.vh);
if(current.SimilarTailVer == null)
break;
current = current.SimilarTailVer;
}
System.out.println();
}
System.out.println("十字链表各节点详细信息如下:");
int count = 0;
for(int i = 0; i < graph.verNum; i++){
Data2 dt = graph.dianArray[i];
System.out.print(dt.data+"顶点的入度为:");
Vertex2 current = new Vertex2();
if(dt.inArc != null){
current = dt.inArc;
count++;
while(current.SimilarHeadVer != null){
count++;
current = current.SimilarHeadVer;
}
}
System.out.print(count + ", ");
count = 0;
System.out.print(dt.data+"顶点的出度为:");
Vertex2 current1 = new Vertex2();
if(dt.outArc != null){
current1 = dt.outArc;
count++;
while(current1.SimilarTailVer != null){
count++;
current1 = current1.SimilarTailVer;
}
}
System.out.println(count);
count = 0;
}
}
public static void main(String[] args) {
Graph2 graph = new Graph2();
OLtest createGraph = new OLtest();
createGraph.initialGraph(graph);
createGraph.outputGraph(graph);
}
}