邻接表 主要适用于 点较多而边较少的情况。可以减少占用空间
package 图;
import java.util.Scanner;
public class AdjacencyList {//实现 邻接表
static class Node{
char data;//结点数据
int index;//邻接点 在数组中的坐标
Node next;//指针
int weight;//存储 两个点之间 边的权值 边表中才用得到
}
int vexnum,edgenum;//边数和点数
Node[] adjlist;//链表中 顶点的next指针相当于头指针。
public AdjacencyList(int vexnum,int edgenum) {
this.vexnum=vexnum;
this.edgenum=edgenum;
adjlist=new Node[vexnum];
for(int i=0;i<vexnum;i++) {//创建 节点数组
adjlist[i]=new Node();
}
}
public void creatAdjacencyList() {
Scanner sc=new Scanner(System.in);
System.out.println("输入节点信息");
for(int i=0;i<vexnum;i++) {
adjlist[i].data=sc.next().charAt(0);//录入结点信息
adjlist[i].next=null;//边表置为空。
}
//建立边表 使用头插法创建
for(int i=0;i<edgenum;i++) {//边数 就是你需要创建的结点总数
int m,n,w;
System.out.println("输入(vm,vn)的结点序号");
m=sc.nextInt();
n=sc.nextInt();
System.out.println("输入权值");
w=sc.nextInt();
Node e=new Node();
e.index=n;
e.weight=w;
e.next=adjlist[m].next;
adjlist[m].next=e;
//因为是无向图 所以对应的 vn也可以访问到vm
//其实可以发现,在这里我们不断改变顶点的指针的指向,就相当于链表中的头插法,不断改变头指针 让它指向新插入的结点。
e=new Node();
e.index=m;
e.weight=w;
e.next=adjlist[n].next;
adjlist[n].next=e;
System.out.println("边创建完成");
}
}
public void display(){//显示 邻接的点
for(int i=0;i<adjlist.length;i++) {
System.out.println("与V"+i+"邻接的点");
Node p=adjlist[i].next;
while(p!=null) {
System.out.println("V"+p.index+" ");
p=p.next;
}
System.out.println();
}
}
public static void main(String[] args) {
AdjacencyList list=new AdjacencyList(4,5);
list.creatAdjacencyList();
list.display();
}
}