(java版)用邻接表实现无向图的创建

出现的问题:1.关于内部类的使用,使邻接表的结构定义更加清晰,不分散。在同一个类中实例化内部类和普通类的实例化相同,但在其他类中应用,实例化时需要加上外部实例化对象。例:

OutClass out = new OutClass();
OutClass.InnerClass inner = out.new InnerClass();

 

2.关于自定义类数组的使用:

Vertex[] vertexNode;           //声明要创建的对象数组


vertexNode = new Vertex[size];    //创建对象数组,为对象数组开辟空间


vertexNode[0] = new Vertex();     //创建数组对象,为数组对象开辟空间


vertexNode[0].data   //使用数组对象中的属性

 上代码:

public class Test2 {

	int size;
	Vertex[] vertexNode;
	class Vertex{
		char data;
		EdgeNode firstEdge;
	}
	class EdgeNode{
		int adjvex;      //顶点数组中顶点的下标
		int weight;
		EdgeNode next;
	}
	public Test2(char[] vertexs,char[][] edges) {
		int size = vertexs.length;
		this.size = size;
		vertexNode = new Vertex[size];
		System.out.println(size);
		for(int i=0;i<size;i++) {
			vertexNode[i] = new Vertex();
			vertexNode[i].data = vertexs[i];
		}
		for(char[] c:edges) {
			//无向图需要双向奔赴
			EdgeNode edgeNode1 = new EdgeNode();
			edgeNode1.adjvex = getPosition(c[1]);
			edgeNode1.next = vertexNode[getPosition(c[0])].firstEdge;
			vertexNode[getPosition(c[0])].firstEdge = edgeNode1;
			
			EdgeNode edgeNode2 = new EdgeNode();
			edgeNode2.adjvex = getPosition(c[0]);
			edgeNode2.next = vertexNode[getPosition(c[1])].firstEdge;
			vertexNode[getPosition(c[1])].firstEdge = edgeNode2;
		}
	}
	private int getPosition(char data) {
		for(int i=0;i<size;i++) {
			if(vertexNode[i].data == data) {
				return i;
			}
		}
		return -1;
	}
	public static void main(String[] args) {
		char[] vexs = {'A','B','C','D','E','F','G','H','I','J','K'};
		char[][] edges = new char[][] {
			{'A','C'},
			{'A','D'},
			{'A','F'},
			{'B','C'},
			{'C','D'},
			{'E','G'},
			{'D','G'},
			{'I','J'},
			{'J','G'},
			{'E','H'},
			{'H','K'},
		};
		Test2 test2 = new Test2(vexs, edges);
		for(int i=0;i<test2.size;i++) {
			System.out.print("顶点序号"+i+" "+test2.vertexNode[i].data+"->");
			while(test2.vertexNode[i].firstEdge!=null) {
				System.out.print(test2.vertexNode[test2.vertexNode[i].firstEdge.adjvex].data
						+"->");
				test2.vertexNode[i].firstEdge = test2.vertexNode[i].firstEdge.next;
			}
			System.out.println();
		}
	}
}

执行结果: 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值