现在的位置: 首页 > 综合 > 正文

图的存储方式–邻接矩阵法

2018年01月21日 ⁄ 综合 ⁄ 共 1887字 ⁄ 字号 评论关闭

邻接矩阵法

    邻接矩阵又称数组表示,它采用两个数组表示图:一个数组表示顶点信息(一维数组),另一个数组表示个顶点的关系,这个关系数组叫做邻接矩阵(在邻接矩阵中,若为无向图,矩阵的元素为1或0,1表示有关系,0反之;若为有向网络,则矩阵中的元素表示权,无权值则无无穷)

C语言描述:

#define MAX_VERTEX_NUM 20					//可容纳的最多的顶点个数
#define INFINTY 32768						//表示无穷大
typedef enum{DG,DN,UDG,UDN} GraphKing;		//图的种类(分别表示有向图,有向网络,无向图,无向网络)
typedef char VertexData;					//图顶点的数据类型,根据实际需要更改
typedef int AdjType;						//对于无权图,用1或0表示是否相邻;对于带权图则表示权值
typedef struct{								//struct  定义顶点信息
	AdjType adj;
	/*可编写其他信息*/
}ArcNode;
typedef struct {
	VertexData vertex[MAX_VERTEX_NUM];		//顶点数组
	ArcNode arcs[MAX_VERTEX_NUM]
				[MAX_VERTEX_NUM];			//邻接矩阵
	int vexnum,arcnum;						//顶点数目和边的数目
	GraphKing kinig;						//图的类型
}AdjMatrix;									//Adjacency Matrix Graph 邻接矩阵

下面给出测试代码:

#include<stdio.h>
#define MAX_VERTEX_NUM 20					//可容纳的最多的顶点个数
#define INFINITY 32768						//表示无穷大
typedef enum{DG,DN,UDG,UDN} GraphKing;		//图的种类(分别表示有向图,有向网络,无向图,无向网络)
typedef int VertexData;						//图顶点的数据类型,根据实际需要更改
typedef int AdjType;						//对于无权图,用1或0表示是否相邻;对于带权图则表示权值
typedef struct{								//struct  定义顶点信息
	AdjType adj;
	/*可编写其他信息*/
}ArcNode;
typedef struct {
	VertexData vertex[MAX_VERTEX_NUM];		//顶点数组
	ArcNode arcs[MAX_VERTEX_NUM]
				[MAX_VERTEX_NUM];			//邻接矩阵
	int vexnum,arcnum;						//顶点数目和边的数目
	GraphKing kinig;						//图的类型
}AdjMatrix;									//Adjacency Matrix Graph 邻接矩阵

//找出该顶点 V 在数组vertex[]中对应位置
int LocateVertex(AdjMatrix *G,VertexData v){
	int j,k;
	for(k=0;k<G->vexnum;k++){
		if(G->vertex[k] == v){
			j = k;
			break;
		}
	}
	return j;
}


void CreateDN(AdjMatrix *G)
{
	int i,j,k,weight;
	VertexData v1,v2;
	
	printf("输入顶点个数和边数:\n");
	scanf("%d%d",&G->vexnum,&G->arcnum);	//顶点和边的数目

	printf("输入%d个顶点\n",G->vexnum);
	for(i=0;i<G->vexnum;i++)
		scanf("%d",&G->vertex[i]);

	/*初始化,将矩阵的元素赋值为无穷*/
	for(i=0;i<G->vexnum;i++){
		for(j=0;j<G->vexnum;j++){
			G->arcs[i][j].adj = -1;//-1代表无穷
		}
	}
	printf("输入边的两个顶点,及该边的权值(逗号隔开)\n");
	for(k=0;k<G->arcnum;k++){
		scanf("%d%d%d",&v1,&v2,&weight);

		i = LocateVertex(G,v1);
		j = LocateVertex(G,v2);

		G->arcs[i][j].adj = weight;
	}
}
void PAdjMatrix(AdjMatrix *G)
{
	int i,j;
	for(i=0;i<G->vexnum;i++)
	{
		for(j=0;j<G->vexnum;j++){
			printf("%d\t",G->arcs[i][j].adj);
		}
		printf("\n");
	}
}
int main()
{
	AdjMatrix G;
	CreateDN(&G);
	PAdjMatrix(&G);
	return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.