原贴地址:http://blog.csdn.net/feixiaoxing/article/details/6918768
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
图是数据结构里面的重要一章。通过图,我们可以判断两个点之间是不是具有连通性;通过图,我们还可以计算两个点之间的最小距离是多少;通过图,我们还可以根据不同的要求,寻找不同的合适路径。当然,有的时候为了计算的需要,我们还需要从图中抽象出最小生成树,这样在遍历计算的时候就不需要持续判断是不是遇到了循环节点。当然,这所有的一切都是从图的表示开始的。
1)矩阵表示
矩阵表示可以说是最简单的表示方法,如果说一个图中有5个点,那么我们就可以构建一个5*5的矩阵。如果点和点之间存在连接,那么填上1;反之如果不存在连接,那么可以用0表示,当然对角线上面的点是没有意义的。如下图所示:
- static int graph[5][5] =
- {
- {0, 1, 0, 1, 1},
- {1, 0, 1, 0, 1},
- {0, 1, 0, 1, 0},
- {1, 0, 1, 0, 1},
- {1, 1, 0, 1, 0}
- };
- static int graph[5][5] =
- {
- {0, 0, 0, 0, 0},
- {1, 0, 0, 0, 0},
- {0, 1, 0, 0, 0},
- {1, 0, 1, 0, 0},
- {1, 1, 0, 1, 0}
- };
- static int graph[5][5] =
- {
- {0, 0, 0, 0, 0},
- {3, 0, 0, 0, 0},
- {0, 6, 0, 0, 0},
- {8, 0, 4, 0, 0},
- {9, 2, 0, 7, 0}
- };
2)数组结构
为了改变矩阵浪费空间的特点,我们可以建立一个只有顶点和边组成的数据空间。比如说,我们定义一个这样的结构:
- typedef struct _LINE
- {
- int start;
- int end;
- int weight;
- int isDirection;
- }LINE;
但是,我们还是觉得有遗憾的地方。这个数据结构过分强调了边的意义和重要性,忽略了顶点本身的含义。因为,我们在强调边的时候,应该添加进顶点的相关特性。离开顶点的支持,单纯的边信息是没有什么含义的。
3)基于顶点链表的图表示
首先,我们定义顶点的基本结构:
- typedef struct _LINE
- {
- int end;
- int weight;
- struct _LINE* next;
- }LINE;
- typedef struct _VECTEX
- {
- int start;
- int number;
- LINE* neighbor;
- }VECTEX;
- typedef struct _PATH
- {
- int start;
- int end;
- int lenth;
- LINE* next;
- }PATH;
注意事项:
1)数组和链表是图结构的基础,朋友们应该好好掌握
2)每一种数据结构都有自己的应用场合,关键是理解其中的思想和方法
3)图的表示是图运算的基础,掌握它们是我们进一步学习的基本条件