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

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

        相邻表法只记录图形中存在的连接,也即只记录相邻矩阵中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] 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值