【数据结构】图形的多种表示方法及其java实现之相邻表法

来源:互联网 发布:资源站源码 编辑:程序博客网 时间:2024/05/21 08:55

        上一篇博文讲到用相邻矩阵法表示图形,该方法的优点是直观,访问方便,缺点是,当图形的规模庞大,节点数目很多时,有许多节点之间并无连接,这样就浪费了大量的存储空间。而相邻表法则解决了这一问题。

        相邻表法只记录图形中存在的连接,也即只记录相邻矩阵中1的部分。

               

使用相邻表法表示的话,每个节点使用一张表,每张表包括一个表头和与该节点相连的其他节点,表头用来表征该表与哪个节点相对应。如上述无向图和有向图,用相邻表法分别表示如下:

               

        生成相邻表的源代码如下:

package javaTest;public class GraphList {//列表类,每一个列表有n个链接类构成,n为节点的个数public static void main(String args[]){int[][] data1 = {{1,2},{2,1},{1,4},{4,1},{1,5},{5,1},{2,3},{3,2},{2,4},{4,2},{3,4},{4,3},{3,5},{5,3}};int[][] data2 = {{1,2},{1,5},{2,4},{3,2},{3,4},{4,1},{5,3}};System.out.println("The undirected graph expressed with link list:");new GraphList(data1);System.out.println();System.out.println("The directed graph expressed with link list:");new GraphList(data2);}public GraphList(int[][] data){int maxNodeValue = 0;for(int i=0; i<data.length; i++){//判断初始数据中提供的节点的个数for(int j=0; j<data[i].length; j++){if(maxNodeValue<data[i][j]){maxNodeValue = data[i][j];}}}GraphLink[] linkHead = new GraphLink[maxNodeValue+1];for(int i=1; i<linkHead.length; i++){linkHead[i] = new GraphLink();for(int j=0; j<data.length; j++){if(data[j][0]==i){linkHead[i].insert(data[j][1]);}}System.out.print("Node"+i+"->");linkHead[i].print();System.out.println();}}}class Node{//节点类int value;Node nextNode;public Node(int value){this.value = value;nextNode = null;}}class GraphLink{//链接类Node head;Node tail;public boolean isEmpty(){return head==null;}public void print(){//打印链接Node tempNode = head;while(tempNode != null){System.out.print("["+tempNode.value+"] ");tempNode = tempNode.nextNode;}}public void insert(int value){//往链接中插入节点Node tempNode = new Node(value);if(this.isEmpty()){head = tempNode;tail = tempNode;}else{tail.nextNode = tempNode;tail = tempNode;}}}
程序输出:

The undirected graph expressed with link list:
Node1->[2] [4] [5] 
Node2->[1] [3] [4] 
Node3->[2] [4] [5] 
Node4->[1] [2] [3] 
Node5->[1] [3] 


The directed graph expressed with link list:
Node1->[2] [5] 
Node2->[4] 
Node3->[2] [4] 
Node4->[1] 
Node5->[3] 

0 0
原创粉丝点击