下面写的代码可能感觉会很乱,所以加上了目录,意在为了引导,也就是你需要回顾哪个算法,就能够快速定位到该位置。
另外,阅读代码是件非常枯燥的事,所以尽量每一行都加的注释,方便阅读理解。
四、图
(一)图的顺序存储结构——邻接矩阵
-
结构体的声明
typedef enum { DG_GRAPH = 0, //有向图 DN_GRAPH //无向图 }GRAPH_TYPE; //图的类型结构体 typedef struct { int no; //顶点的编号 int data; //顶点存放的数据 }VERTEX_TYPE; //顶点类型结构体 typedef struct { int n, e; //n为顶点数,e为边数 int edge[MAXSIZE][MAXSIZE]; //存放邻接矩阵的边信息 VERTEX_TYPE ver_type[MAXSIZE]; //存放结点信息 GRAPH_TYPE graph_type; //图的类型(可写可不写) }MGRAPH; //图的邻接矩阵结构体
-
图的邻接矩阵表示
/* method: 构造图的邻接矩阵 param: m_graph 图 vex_num 顶点的数量 edges 边的信息 */ int CreateDG(MGRAPH** m_graph,GRAPH_TYPE graph_type ,int vex_num, int edges[][MAXSIZE]) { int edge_num = 0; int i = 0, j = 0; (*m_graph)->n = vex_num; //结点个数赋值 for (i = 0; i < vex_num; i++) { (*m_graph)->ver_type[i].no = i; //顶点序号为下标 (*m_graph)->ver_type[i].data = i; //顶点数据为下标 for (j = 0; j < vex_num; j++) { (*m_graph)->edge[i][j] = edges[i][j]; //给图的边赋值 if (graph_type == DG_GRAPH) //判断有向图还是无向图 { if (edges[i][j] == 1) //计算边的数量 ++edge_num; } else if(graph_type == DN_GRAPH) //判断有向图还是无向图 { if (edges[i][j] != MAX_NUM && edges[i][j] != 0) //计算边的数量 ++edge_num; } } } if(graph_type == DG_GRAPH) (*m_graph)->e = edge_num; //边的个数 else if(graph_type == DN_GRAPH) (*m_graph)->e = edge_num / 2; //无向图边的个数为 1 的一半 return OK; }
(二)图的链式存储结构——邻接表
-
结构体的声明
#define OK 1 #define ERROR -1 #define MAXSIZE 6 typedef struct ArcNode { int adj_vertex; //该边所指向的顶点信息 struct ArcNode* nextarc; //指向下一条边的指针 int info; //该边的相关信息,如权值 }ArcNode; //弧指针结构体 typedef struct { int data; //顶点信息 ArcNode* first_arc; //指向第一条边的指针 }V_NODE; //顶点指针结构体 typedef struct { V_NODE adj_list[MAXSIZE]