【二十五】图的存储结构--邻接矩阵法
2015-07-09 16:50
274 查看
1、邻接矩阵法
基本思想:
示例:
从上面两个示例中也可看出:
2、数据结构的定义
顶点间边的描述需要使用二维数组,所以需要动态创建二维数组;
3、动态创建二维数组
4、算法实现
数据结构定义:
创建图操作:
添加、删除边操作:
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
基本思想:
示例:
从上面两个示例中也可看出:
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
相关文章推荐
- 发布Sliverlight程序的正确流程
- 工作日记
- Android跳转到应用下载平台,给当前APP评分
- 关于RTC引起的待机功耗的问题
- 使用maven-jar-plugin打可执行jar包
- POJ 2155 Matrix(二维树状数组,绝对详细)
- 多线程下载框架xUtils
- [MFC]利用Win32 API遍历文件系统
- 学习深度
- gemfire说明
- DEV-aspxgridview中的javascprit中获取所有行
- nodejs对文件进行分页
- CentOS Rsync服务端与Windows cwRsync客户端实现数据同步配置方法
- lua string
- CAEmitterLayer
- 0欧姆电阻、磁珠、电感的应用
- 摘自ubuntuer- Linux防火墙iptables学习笔记(四)iptables实现NAT
- 字符串过长(Heredoc结构形式方法)
- Dependency Injection pattern
- JAVA基础题