图的储存

一:邻接矩阵储存

对于图中的n个顶点采用顺序存储,任意两个顶点之间是否有边,则用一个NxN的矩阵来表示。规定矩阵的元素为:
Aij=1(若点Vi和Vj之间有边,若是网图,Aij=权值),Aij=0(若点Vi和Vj没边)

图的定义:

class Graph{
	char vexs[]=new char[10];//顶点表
	int edges[][]=new int[10][10];//邻接矩阵
	int Vnum;//定点数
	int Enum;//边数
}

建立一个有向图G的临界矩阵存储:

Graph CreatMGraph(){
		Graph graph = null;
		Scanner scanner=new Scanner(System.in);
		System.out.println("请输入顶点数和边数");
		graph.Vnum=scanner.nextInt();
		graph.Enum=scanner.nextInt();
		for (int i = 0; i < graph.Vnum; i++) {
			graph.vexs[i]=scanner.next().charAt(0);//输入顶点信息
		}
		for (int i = 0; i < graph.Enum; i++) {
			int x,y;
			x=scanner.nextInt();
			y=scanner.nextInt();
			graph.edges[x][y]=1;//输入边的信息,把邻接矩阵的对应边设置为1
			//graph.edges[y][x]=1;//若是无向图,则还要加上反向的边
		}
		return graph;
	}

二:邻接表储存

邻接表储存是图的顺序存储与链式存储结合的存储方法。
每一条边存储一个节点,把某个顶点Vi所有的邻接边链接成一个单链表,
将该单链表的头指针和这个顶点的信息作为顶点结点依次存储起来,就构成了图的邻接表。

邻接表储存图示

在邻接表中有两种结构
一种是顶点节点的结构,它由顶点域和指向第一条邻接边的指针域构成;另一种是边结点结构,它由临街点域和指向下一条邻接边的指针域构成
类的定义:

class ALGraph{
	VNode List[]=new VNode[10];//建立邻接表
	int Vnum,Enum;//顶点数和边数
}
class VNode{
		char vertex;//顶点域
		boolean isReaded;//判断是否被遍历过
		ENode next;//指向下一个结点的指针
}
class ENode{
		int adjvex;//结点在邻接表中的下标
		boolean isReaded;//判断是否被遍历过
		ENode next;//指向下一个结点的指针
}

建立有向图的邻接表储存:

ALGraph creatAlGraph(){
		ALGraph graph=null;
		//建立有向图的邻接表存储
		System.out.println("请输入顶点数和边数:");
		Scanner scanner=new Scanner(System.in);
		graph.Vnum=scanner.nextInt();
		graph.Enum=scanner.nextInt();
		for (int i = 0; i < graph.Vnum; i++) {//建立顶点表
			graph.List[i].vertex=scanner.next().charAt(0);//读入一个字符放到顶点表的对应位置
			graph.List[i].isReaded=false;
			graph.List[i].next=null;
		}
		for (int i = 0; i < graph.Enum; i++) {
			ENode eNode=new ENode();
			int x;
			x=scanner.nextInt();
			eNode.adjvex=scanner.nextInt();
			eNode.next=graph.List[x].next;
			graph.List[x].next=eNode;
			
			
		}
		return graph;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值