1、邻接矩阵法
基本思想:
示例:
从上面两个示例中也可看出:
2、数据结构的定义
顶点间边的描述需要使用二维数组,所以需要动态创建二维数组;
3、动态创建二维数组
4、算法实现
数据结构定义:
typedef struct _struct_mgraph
{
int count; //保存顶点数目
MVertex **data; //一维数组,保存顶点的数据的地址
int **matrix; //二维矩阵的地址,保存顶点间关系--边
}TMGraph;
创建图操作:
/*
* 创建并返回有n个顶点的图
* 参数:
data: 存放各顶点数据地址的指针数组
n: 该图顶点的数目
* 返回值:
如果成功,返回该图的有效地址;
如果失败,返回NULL;
*/
MGraph* MGraph_Create(MVertex **data,int n)
{
TMGraph *ret = NULL;
if((data != NULL) && ( n > 0))
{
//动态申请图结构的空间
ret = malloc(sizeof(TMGraph));
if(ret != NULL)
{
ret->count = n;
//申请一维数组,存放顶点数据地址
ret->data = (MVertex**)malloc(sizeof(MVertex*) * n);
//申请二维数组空间
ret->matrix = (int**)malloc(sizeof(int*) * n);
int *p = calloc(n * n,sizeof(int)); //申请空间并初始化为0
if((ret->data != NULL) && (ret->matrix != NULL) && (p != NULL))
{
for(int i = 0; i < ret->count; i++)
{
//将节点的数据的地址,放入ret->data数组中
ret->data[i] = data[i]; //data为参数中传入的各顶点数据的指针数组
//真正意义上的“构造”二维数组
ret->matrix[i] = p + i * n;
}
}
else
{
free(p);p = NULL;
free(ret->matrix);ret->matrix = NULL;
free(ret->data); ret->data = NULL;
free(ret);ret = NULL;
}
}
}
return ret;
}
添加、删除边操作:
/*
在graph所指图中的v1和v2之间加上边,且边的权为w
* 参数:
graph: 指向图的指针
v1: 顶点1
v2: 顶点2
w: 两顶点之间边的权值
* 返回值:
如果成功,返回非0值
如果失败,返回0
*/
int MGraph_AddEdge(MGraph* graph, int v1, int v2, int w)
{
int iret = 1;
TMGraph *tgraph = (TMGraph*)graph;
iret = (tgraph != NULL);
iret = iret && (0 <= v1) && (v1 < tgraph->count);
iret = iret && (0 <= v2) && (v2 < tgraph->count);
iret = iret && (w >= 0);
if(iret)
{
tgraph->matrix[v1][v2] = w;
}
return iret;
}
/*
将graph所指图中v1和v2之间的边删除,返回权值
* 参数:
graph: 指向图的指针
v1: 顶点1
v2: 顶点2
* 返回值:
如果成功,返回两顶点之间边的权值,该值非负
如果失败,返回-1
*/
int MGraph_RemoveEdge(MGraph* graph, int v1, int v2)
{
int iret = -1;
TMGraph *tgraph = (TMGraph*)graph;
int condition = 1;
condition = (tgraph != NULL);
condition = condition && (0 <= v1) && (v1 < tgraph->count);
condition = condition && (0 <= v2) && (v2 < tgraph->count);
if(condition)
{
iret = tgraph->matrix[v1][v2];
tgraph->matrix[v1][v2] = 0;
}
return iret;
}
5、小结
邻接矩阵法表示图结构时,实际上就是创建一个TMGraph头结构,该结构中,data时一个一维数组,用于存放顶点数据的地址,大小由顶点数目决定;因为存放的是指针,所以结构中将它声明为二级指针;每个顶点之间的关系存放在图结构的matrix二维数组中,依据顶点编号在二维数组中定位。
6、完整源码下载
文件名:mgraph-1.0.tar.gz
链接: http://pan.baidu.com/s/1qWC8bak 密码: vrys
编译步骤:
0.1 解压缩:tar -zxvf mgraph-1.0.tar.gz
0.2 进入目录:./configure
0.3 生成可执行文件:make
0.4 运行程序:./MGraph