-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.
第一:
图的定义
? 定义
图是由顶点集合(Vertex) 及顶点间的关系集合组成的一种数据结构 :
Graph = ( V E )
V = { x | x ∈ ∈ 某个数据对象 } 是顶点的有穷非空集合 ;
E = { (x, y) | x, y ∈ ∈ V } 是顶点之间关系的有穷集合 , 也叫做边(Edge) 集合
第二:
? 无向边
? 若顶点 x 和 和 y 之间的边没有方向 , 则称该边为无向边(x, y)
? (x, y) 与 与 (y, x) 意义相同 , 表示 x 和 和 y
? 无向图
若图中任意两个顶点之间的边均是无向边 ,
? 有向边
若顶点 x 和 和 y 之间的边有方向 , 则称该边为有向边<x, y>
<x, y> 与 与 <y, x> 意义不同 , 表示从 x 连接到 y ,x 称为尾,y 称为头
? 有向图
? 若图中任意两个顶点之间的边均是有向边 ,则称该图为有向图
第三:
? 度 (Degree) 的定义
顶点 v 和 的度是和 v 相关联的边的数目 , 记为TD(v)
• 入度 : 以 以 v 为头的边的数目 , 记为ID(v)
• 出度 : 以 以 v 为尾的边的数目 , 记为OD(v)
很显然 :
TD(v) = ID(v) + OD(v)
E = [TD(v 1 ) + TD(v 2 ) + … + TD(v n )] / 2
E = ID( v 1 ) + ID(v 2 ) + … + ID(v n )
E = OD(v 1 ) + OD(v 2 ) + … + OD(v n )
? 权 (Weight) 的定义
? 与图的边相关的数字叫做权
• 权常用来表示图中顶点间的距离或者耗费
第四:
? 图的一些常用操作
创建图
销毁图
清空图
加入边
删除边
获取权
获取结点的度
获取图的结点数
获取图的边数
图在程序中表现为一种特殊的数据类型
图的操作在程序中的表现为一组函数
第五:
用C 语言描述图结构
#ifndef _GRAPH_H_
#define _GRAPH_H_
typedef void Graph;
typedef void Vertex;
/* 创建并返回有n个顶点的图 */
Graph* Graph_Create(int n);
/* 销毁graph所指向的图 */
void Graph_Destroy(Graph* graph);
/* 将graph所指图的边集合清空 */
void Graph_Clear(Graph* graph);
/* 在graph所指图中的v1和v2之间加上边,且边的权为w */
int Graph_AddEdge(Graph* graph, int v1, int v2, int w);
/* 将graph所指图中v1和v2之间的边删除,返回权值 */
int Graph_RemoveEdge(Graph* graph, int v1, int v2);
/* 将graph所指图中v1和v2之间的边的权值返回 */
int Graph_GetEdge(Graph* graph, int v1, int v2);
/* 将graph所指图中v顶点的度数 */
int Graph_TD(Graph* graph, int v);
/* 将graph所指图中的顶点数返回 */
int Graph_VertexCount(Graph* graph);
/* 将graph所指图中的边数返回 */
int Graph_EdgeCount(Graph* graph);
#endif
#include <malloc.h>
#include "Graph.h"
Graph* Graph_Create(int n)
{
return NULL;
}
void Graph_Destroy(Graph* graph)
{
}
void Graph_Clear(Graph* graph)
{
}
int Graph_AddEdge(Graph* graph, int v1, int v2, int w)
{
return 0;
}
int Graph_RemoveEdge(Graph* graph, int v1, int v2)
{
return 0;
}
int Graph_GetEdge(Graph* graph, int v1, int v2)
{
return 0;
}
int Graph_TD(Graph* graph, int v)
{
return 0;
}
int Graph_VertexCount(Graph* graph)
{
return 0;
}
int Graph_EdgeCount(Graph* graph)
{
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include "Graph.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[])
{
Graph* graph = Graph_Create(5);
Graph_AddEdge(graph, 0, 1, 1);
Graph_AddEdge(graph, 1, 0, 1);
Graph_Destroy(graph);
return 0;
}
小结
? 图是一种扩展的树结构 , 每个结点可以指向任意的其它结点
? 链表是特殊的树结构 , 树是特殊的图结构
? 图这种数据结构常用于网络规划和路径路径规划等领域
GPS 相关产品中大量应用了图结构和图算法 。