设为首页 加入收藏

TOP

邻接矩阵有向图(一)之 C语言详解
2015-01-22 21:34:23 来源: 作者: 【 】 浏览:63
Tags:邻接 矩阵 向图 语言 详解
本章介绍邻接矩阵有向图。在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了。和以往一样,本文会先给出C语言的实现;后续再分别给出C++和Java版本的实现。实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可。若文章有错误或不足的地方,请不吝指出!
?
目录?
1. 邻接矩阵有向图的介绍?
2. 邻接矩阵有向图的代码说明?
3. 邻接矩阵有向图的完整 源码
?
?
?
更多内容:数据结构与算法系列 目录
?
?
邻接矩阵有向图的介绍
邻接矩阵有向图是指通过邻接矩阵表示的有向图。
?
?
?
上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了",,,,,,,,"共9条边。
?
上图右边的矩阵是G2在内存中的邻接矩阵示意图。A[i][j]=1表示第i个顶点到第j个顶点是一条边,A[i][j]=0则表示不是一条边;而A[i][j]表示的是第i行第j列的值;例如,A[1,2]=1,表示第1个顶点(即顶点B)到第2个顶点(C)是一条边。
?
?
邻接矩阵有向图的代码说明
1. 基本定义
?
复制代码
// 邻接矩阵
typedef struct _graph
{
? ? char vexs[MAX]; ? ? ? // 顶点集合
? ? int vexnum; ? ? ? ? ? // 顶点数
? ? int edgnum; ? ? ? ? ? // 边数
? ? int matrix[MAX][MAX]; // 邻接矩阵
}Graph, *PGraph;
复制代码
Graph是邻接矩阵对应的结构体。
?
vexs用于保存顶点,vexnum是顶点数,edgnum是边数;matrix则是用于保存矩阵信息的二维数组。例如,matrix[i][j]=1,则表示"顶点i(即vexs[i])"和"顶点j(即vexs[j])"是邻接点;matrix[i][j]=0,则表示它们不是邻接点。
?
2. 创建矩阵
?
这里介绍提供了两个创建矩阵的方法。一个是用已知数据,另一个则需要用户手动输入数据。
?
2.1 创建图(用已提供的矩阵)
?
复制代码
/*
?* 创建图(用已提供的矩阵)
?*/
Graph* create_example_graph()
{
? ? char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
? ? char edges[][2] = {
? ? ? ? {'A', 'B'},?
? ? ? ? {'B', 'C'},?
? ? ? ? {'B', 'E'},?
? ? ? ? {'B', 'F'},?
? ? ? ? {'C', 'E'},?
? ? ? ? {'D', 'C'},?
? ? ? ? {'E', 'B'},?
? ? ? ? {'E', 'D'},?
? ? ? ? {'F', 'G'}};?
? ? int vlen = LENGTH(vexs);
? ? int elen = LENGTH(edges);
? ? int i, p1, p2;
? ? Graph* pG;
?
? ? // 输入"顶点数"和"边数"
? ? if ((pG=(Graph*)malloc(sizeof(Graph))) == NULL )
? ? ? ? return NULL;
? ? memset(pG, 0, sizeof(Graph));
?
? ? // 初始化"顶点数"和"边数"
? ? pG->vexnum = vlen;
? ? pG->edgnum = elen;
? ? // 初始化"顶点"
? ? for (i = 0; i < pG->vexnum; i++)
? ? {
? ? ? ? pG->vexs[i] = vexs[i];
? ? }
?
? ? // 初始化"边"
? ? for (i = 0; i < pG->edgnum; i++)
? ? {
? ? ? ? // 读取边的起始顶点和结束顶点
? ? ? ? p1 = get_position(*pG, edges[i][0]);
? ? ? ? p2 = get_position(*pG, edges[i][1]);
?
? ? ? ? pG->matrix[p1][p2] = 1;
? ? }
?
? ? return pG;
}
复制代码
createexamplegraph()是的作用是创建一个邻接矩阵有向图。实际上,该方法创建的有向图,就是上面的图G2。
?
2.2 创建图(自己输入)
?
复制代码
/*
?* 创建图(自己输入)
?*/
Graph* create_graph()
{
? ? char c1, c2;
? ? int v, e;
? ? int i, p1, p2;
? ? Graph* pG;
?
? ? // 输入"顶点数"和"边数"
? ? printf("input vertex number: ");
? ? scanf("%d", &v);
? ? printf("input edge number: ");
? ? scanf("%d", &e);
? ? if ( v < 1 || e < 1 || (e > (v * (v-1))))
? ? {
? ? ? ? printf("input error: invalid parameters!\n");
? ? ? ? return NULL;
? ? }
?
? ? if ((pG=(Graph*)malloc(sizeof(Graph))) == NULL )
? ? ? ? return NULL;
? ? memset(pG, 0, sizeof(Graph));
?
? ? // 初始化"顶点数"和"边数"
? ? pG->vexnum = v;
? ? pG->edgnum = e;
? ? // 初始化"顶点"
? ? for (i = 0; i < pG->vexnum; i++)
? ? {
? ? ? ? printf("vertex(%d): ", i);
? ? ? ? pG->vexs[i] = read_char();
? ? }
?
? ? // 初始化"边"
? ? for (i = 0; i < pG->edgnum; i++)
? ? {
? ? ? ? // 读取边的起始顶点和结束顶点
? ? ? ? printf("edge(%d):", i);
? ? ? ? c1 = read_char();
? ? ? ? c2 = read_char();
?
? ? ? ? p1 = get_position(*pG, c1);
? ? ? ? p2 = get_position(*pG, c2);
? ? ? ? if (p1==-1 || p2==-1)
? ? ? ? {
? ? ? ? ? ? printf("input error: invalid edge!\n");
? ? ? ? ? ? free(pG);
? ? ? ? ? ? return NULL;
? ? ? ? }
?
? ? ? ? pG->matrix[p1][p2] = 1;
? ? }
?
? ? return pG;
}
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C算法与数据结构-线性表的应用,多.. 下一篇Objective-c中的delegate浅析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: