(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();
		}
	}
}

执行结果: 

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现无向图的基本思路是使用邻接表来存储每个顶点的邻居节点。邻接表是指一个数组,每个数组元素对应一个顶点,数组元素的值是一个链表,链表中存储了与该顶点相邻的所有顶点。 下面是用 C++ 实现无向图的代码: ```cpp #include<iostream> #include<vector> using namespace std; class Graph{ private: int V; // 顶点数量 vector<vector<int>> adj; // 邻接表 public: Graph(int V){ this->V = V; adj.resize(V); } void addEdge(int v, int w){ // 无向图邻接表需要同时添加两条边 adj[v].push_back(w); adj[w].push_back(v); } void printGraph(){ for(int i=0; i<V; i++){ cout << i << " -> "; for(int j=0; j<adj[i].size(); j++){ cout << adj[i][j] << " "; } cout << endl; } } }; int main(){ // 创建一个无向图 Graph g(5); g.addEdge(0, 1); g.addEdge(0, 4); g.addEdge(1, 2); g.addEdge(1, 3); g.addEdge(1, 4); g.addEdge(2, 3); g.addEdge(3, 4); // 打印邻接表 g.printGraph(); return 0; } ``` 在上面的代码中,我们定义了一个 Graph 类,其中 V 表示顶点数量,adj 是一个二维向量,用于存储邻接表。addEdge 函数用于向无向图中添加一条边,需要同时添加两条边。printGraph 函数用于打印邻接表。 在 main 函数中,我们创建一个无向图,并添加了一些边,然后打印邻接表。输出结果如下: ``` 0 -> 1 4 1 -> 0 2 3 4 2 -> 1 3 3 -> 1 2 4 4 -> 0 1 3 ``` 这个邻接表表示的无向图如下所示: ``` 0---1 |\ /|\ | X | 2 |/ \|/ 4---3 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值