十字链表的特点
1、可以看成有向图将邻接表和逆邻接表结合,每个结点有两个指针域,分别指向入度边链表和出度边链表
2、时间复杂度与邻接表相同
3、容易计算顶点的度
十字链表的属性
public static final int MAX_VEXNUM_NUM = 20; // 最大顶点数
public static final int INF = 32768; // 表示无穷大
public static int VEXNUM; // 顶点个数
public static int ARCNUM; // 边个数
public static VexNode[] vexs; // 顶点集合
class VexNode{ // 顶点节点
public String data; // 顶点的信息
public ArcNode firstin, firstout; // 指针指向边链表,以该顶点为弧头,以该顶点为弧尾
}
class ArcNode{ // 边节点
public int info; // 边或弧的边信息
public int headvex; // 弧头的位置
public int tailvex; // 弧尾的位置
public ArcNode hlink,tlink; // 指针,指向同弧头的节点,指向同弧尾的节点
}
创建一个有向图
// 创建一个有向图
public void CreateOrList() {
Scanner sc = new Scanner(System.in);
System.out.print("请输入顶点的个数:");
VEXNUM = sc.nextInt(); // 输入顶点的个数
System.out.print("请输入边的个数:");
ARCNUM = sc.nextInt(); // 输入边的个数
// 初始化顶点集合
vexs = new VexNode[VEXNUM];
System.out.print("请输入顶点:");
for (int i = 0; i < VEXNUM; i++) {
vexs[i] = new VexNode(sc.next(), null, null);
}
// 初始化边集合
for (int i = 0; i < ARCNUM; i++) {
System.out.print("请输入(v1,v2):");
String v1 = sc.next();
String v2 = sc.next();
int x1 = Locate(v1);
int x2 = Locate(v2);
System.out.printf("请输入(%s, %s)的权值:", v1, v2);
int info = sc.nextInt(); // 边权值信息
// 该弧指向v1的弧尾边链表域,指向v2的弧头边链表域
ArcNode arcNode = new ArcNode(info, x2, x1, vexs[x2].firstin, vexs[x1].firstout);
// v1的弧尾指针指向该弧,v2的以弧头指针指向该弧
vexs[x1].firstout = arcNode;
vexs[x2].firstin = arcNode;
}
}
打印十字链表的出度链表和入度链表
// 打印ORList
public void display_out() { // 出度链表
for (int i = 0; i < VEXNUM; i++) {
System.out.print("vertex:" + vexs[i].data);
ArcNode point = vexs[i].firstout;
while (point != null){
System.out.print(" headvex:" + point.headvex + " tailvex:" + point.tailvex +
" info:" + point.info);
point = point.tlink;
}
System.out.println();
}
}
public void display_in() { // 入度链表
for (int i = 0; i < VEXNUM; i++) {
System.out.print("vertex:" + vexs[i].data);
ArcNode point = vexs[i].firstin;
while (point != null){
System.out.print(" headvex:" + point.headvex + " tailvex:" + point.tailvex +
" info:" + point.info);
point = point.hlink;
}
System.out.println();
}
}
定位v0在集合中的位置
// 定位v0在集合中的位置
public int Locate(String v0){
for (int i = 0; i < VEXNUM; i++) {
if (v0.equals(vexs[i].data)){
return i;
}
}
return -1;
}