您的位置:首页 > 其它

【二十五】图的存储结构--邻接矩阵法

2015-07-09 16:50 274 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: