图的邻接表存储与深度优先遍历代码实现
2016-05-27 01:23
471 查看
Graph.h
Vnode结构成员firstarc在定义时赋初值NULL,在Visual Stdio 2013下编译通过,VC6.0就不行(非静态数据成员不能初始化)
Graph.cpp
main.cpp
Vnode结构成员firstarc在定义时赋初值NULL,在Visual Stdio 2013下编译通过,VC6.0就不行(非静态数据成员不能初始化)
#include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 20 typedef int InfoType, VertexType; //在这里可以设置顶点和弧数据类型 typedef struct ArcNode { int adjvex; //弧指向顶点的位置 struct ArcNode *nextarc; //指向下一条弧的指针 InfoType *info; //弧相关信息的指针 例如弧长、权重等,这里用不到 }ArcNode; typedef struct VNode { VertexType data; //顶点信息 ArcNode *firstarc = NULL; //指向第一条与该顶点相连的弧 }VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; //每个图类型中包含一个顶点数组 int vexnum, arcnum; //图的顶点数和弧数 int kind; //图的种类标志 }ALGraph; void createG(ALGraph *G); void showG(ALGraph *G); void DFSTraverse(ALGraph G); void DFS(ALGraph G, int i, void(*visit) (VNode v)); inline void Print(VNode v) { printf("%d\n", v.data); } //访问函数
Graph.cpp
#include "Graph.h" int vnum[MAX_VERTEX_NUM] = { false }; //vnum为访问标识数组 void createG(ALGraph *G) //以邻接表存储方式创建图 { //char TemData[64]; //暂时存储顶点数据 int i, j; //函数局部变量i,j用来记录弧的顶点 ArcNode *s; //新建的弧 printf("请输入顶点数和边数:\n"); scanf("%d%d", &G->vexnum, &G->arcnum); for (int i = 0; i < G->vexnum; i++) //输入顶点信息,这里可以用下标唯一标识每个顶点 { /*scanf("%s", TemData); G->vertices[i].data = (VertexType)TemData[64];*/ G->vertices[i].data = (VertexType)i; } for (int k = 0; k < G->arcnum; k++) { scanf("%d%d", &i, &j); s = (ArcNode *)malloc(sizeof(ArcNode)); //将s插入到i顶点的表头 s->adjvex = j; s->nextarc = G->vertices[i].firstarc; G->vertices[i].firstarc = s; s = (ArcNode *)malloc(sizeof(ArcNode)); //将s插入到j顶点的表头 s->adjvex = i; s->nextarc = G->vertices[j].firstarc; G->vertices[j].firstarc = s; } } void showG(ALGraph *G) //输出表的信息 { ArcNode* Tem; for (int i = 0; i < G->vexnum; i++) { printf("%d->", i); Tem = G->vertices[i].firstarc; while (Tem != NULL) { printf("%d->", Tem->adjvex); Tem = Tem->nextarc; } printf("\n"); } } void DFSTraverse(ALGraph G) { for (int i = 0; i < G.vexnum; i++) if (!vnum[i]) DFS(G, i, Print); } void DFS(ALGraph G, int i, void(*visit) (VNode v)) //对表G从顶点i开始做深度优先遍历 { vnum[i] = true; visit(G.vertices[i]); for (ArcNode *w = G.vertices[i].firstarc; w != NULL; w = w->nextarc) if (!vnum[w->adjvex]) DFS(G, w->adjvex, Print); }
main.cpp
#include "Graph.h" void main() { ALGraph G; createG(&G); showG(&G); DFSTraverse(G); }
相关文章推荐
- 深度优先搜索的用法——lake counting
- Path Sum(LeetCode)
- Minimum Depth of Binary Tree(LeetCode)
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 图
- 深度优先遍历的栈实现
- 图的深度优先搜索-临接矩阵实现
- 关于邻接表和其深度优先遍历、广度优先遍历的问题
- 图的深度优先遍历(用邻接矩阵表示图)
- 深度优先遍历与广度优先遍历
- 手机九宫格滑锁密码的所有密码组合计算
- 图的深度优先遍历
- LeetCode 21 Palindrome Partitioning
- 一步一步学数据结构之n--n(图遍历--深度优先遍历--递归实现)
- 一步一步学数据结构之n--n(图遍历--深度优先遍历--非递归实现)
- 使用 JsPlumb 绘制拓扑图的通用方法
- 数据结构 - 二叉树的遍历
- 数据结构 - 图的深度优先遍历(C++)
- HDU 1258 Sum It Up
- 数据结构-图
- 二叉树的构建及各种遍历方式