图的储存方式

图的储存方式

-----

邻接矩阵邻接表

图的ADT抽象数据结构

  
ADT  Graph {
    Objects: a nonempty set of vertices and a set of edges, where each edge is a pair of vertices
     Functions: for all graphGraph, v, v1 and v2Vertices
         Graph Create():    return an empty graph
         Graph DeleteEdge(graph, v1, v2):    return a graph in which 
                                                            the edge (v1, v2) is removed
         Boolean IsEmpty(graph):    if (graph==empty graph) return 
                                                 TRUE; else return FALSE
            … …
  } ADT  Graph

一.邻接矩阵

定义: 

无权图

有权图



① 无向图的邻接矩阵一定是一个对称矩阵。因此,在具体存放邻接矩阵时只需存放上(或下)三角矩阵的元素即可。
② 对于无向图,邻接矩阵的第i 行(或第i 列)非零元素(或非∞元素)的个数正好是第i 个顶点的度TD(vi)。
③ 对于有向图,邻接矩阵的第i 行(或第i 列)非零元素(或非∞元素)的个数正好是第i 个顶点的出度OD(vi)(或入度ID(vi))。
④用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连;但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。

这是用邻接矩阵存储图的局限性。

下面介绍图的邻接矩阵存储表示。

在用邻接矩阵存储图时,除了用一个二维数组存储用于表示顶点间相邻关系的邻接矩阵外,还需用一个一维数组来存储顶点信息,另外还有图的顶点数和边数。故可将其形式描述如下:
#define MaxVertexNum 100 /*最大顶点数设为100*/
typedef char VertexType; /*顶点类型设为字符型*/
typedef int EdgeType; /*边的权值设为整型*/
typedef struct {
	VertexType vexs[MaxVertexNum]; /*顶点表*/
	EdeType edges[MaxVertexNum][MaxVertexNum]; /*邻接矩阵,即边表*/
	int n,e; /*顶点数和边数*/
}Mgragh; /*Maragh 是以邻接矩阵存储的图类型*/
建立一个图的邻接矩阵存储的算法如下:

void CreateMGraph(MGraph *G)
{/*建立有向图G 的邻接矩阵存储*/
	int i,j,k,w;
	char ch;
	printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");
	scanf("%d,%d",&(G->n),&(G->e));/*输入顶点数和边数*/
	printf("请输入顶点信息(输入格式为:顶点号<CR>):\n");
	for (i=0;i<G->n;i++) scanf("\n%c",&(G->vexs[i])); /*输入顶点信息,建立顶点表*/
	for (i=0;i<G->n;i++)
	for (j=0;j<G->n;j++) G->edges[i][j]=0; /*初始化邻接矩阵*/
	printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):\n");
	for (k=0;k<G->e;k++)
	{
		scanf("\n%d,%d",&i,&j); /*输入e 条边,建立邻接矩阵*/
		G->edges[i][j]=1; /*若加入G->edges[j][i]=1;,*/
		/*则为无向图的邻接矩阵存储建立*/
	}
}/*CreateMGraph*/






对于稠密图 邻接矩阵操作方式十分简便

但对于稀疏图 邻接矩阵会浪费大量的资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值