邻接表的特点:
1、n个顶点、e条边的无向图的存储空间是n+2e
2、无向图顶点的度是第i个单链表上结点的个数
3、邻接表适用于稀疏图
4、如果要判断任意两顶点是否有边或弧,需要搜索所有的边链表
邻接表的属性
public static final int INF = 32768; // 极大值
public static final int MAX_VERTEX_NUM = 20; // 最大顶点数
public static int VEXNUM; // 顶点的个数
public static int ARCNUM; // 边的个数
public static VexNode[] vexs; // 顶点集合
class VexNode { // 顶点结点
String data; // 顶点名称
ArcNode firstarc; // 边集合的指针
}
class ArcNode { // 边结点
String adjvex; // 边的邻接顶点
int info; // 权值信息
ArcNode nextarc; // 边结点的指针
}
创建一个有向图
public void CreateGraph(){ // 创建一个有向图
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);
}
// 初始化边集合
for (int i = 0; i < ARCNUM; i++) {
System.out.print("请输入(v1,v2):");
String v1 = sc.next();
String v2 = sc.next();
int x1 = Locate(v1);
System.out.printf("请输入(%s, %s)的权值:", v1, v2);
int info = sc.nextInt(); // 边权值信息
ArcNode arcNode = new ArcNode(v2, info, vexs[x1].firstarc); // 创建新的结点并连接到邻接表
vexs[x1].firstarc = arcNode;
}
}
定位顶点v0的位置
// 定位v0所在集合的位置
public int Locate(String v0) {
for (int i = 0; i < VEXNUM; i++) {
if (v0.equals(vexs[i].data)){
return i;
}
}
return -1;
}