图的邻接表存储与深度优先遍历代码实现
来源:互联网 发布:淘宝备注在哪 编辑:程序博客网 时间:2024/06/05 17:51
Graph.h
Vnode结构成员firstarc在定义时赋初值NULL,在Visual Stdio 2013下编译通过,VC6.0就不行(非静态数据成员不能初始化)
#include <stdio.h>#include <stdlib.h>#define MAX_VERTEX_NUM 20typedef 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);}
1 0
- 图的邻接表存储与深度优先遍历代码实现
- 图的邻接表存储与深度优先遍历算法
- 图的邻接表存储 深度优先遍历 广度优先遍历 C语言实现
- 图的邻接表存储 深度优先遍历 广度优先遍历 C语言实现
- 图的邻接表存储下的深度优先遍历
- 图的深度优先遍历(邻接表存储)
- 图的邻接表存储及深度优先遍历程序
- 图邻接表存储 深度优先和广度优先遍历
- 图的深度优先遍历--邻接表实现
- 图算法:1、邻接表实现图的深度优先遍历,广度优先遍历
- 邻接表实现--图的深度优先遍历DFS和广度优先遍历BFS
- 图的深度优先和广度优先遍历算法(用邻接表作为存储结构)
- 邻接表存储图的深度优先、广度优先遍历非递归算法
- 邻接表存储图,深度和广度优先遍历
- 邻接表-图的遍历-广度和深度优先遍历
- 建立图的邻接表储存并实现深度优先和广度优先遍历
- 图的邻接表存储表示 图的深度优先遍历和图的广度优先遍历
- 邻接表的实现与深度遍历
- app登录接口做接口测试
- 写在2016年5月26日
- eclipse中DDMS报错:你的主机中的软件中止了一个已建立的连接。
- how to run an android emulator in ubuntu 14.04
- Oracle 11gExtension Statistics and Expression Statistics
- 图的邻接表存储与深度优先遍历代码实现
- 框架 day38 SVN安装及使用,SSH练习项目CRM,环境搭建(myeclipse hibernate 反转引擎生成PO和映射)
- 栈的基本操作
- 11G新特性 -- Expression Statistics
- 正则表达式的学习之提取字符串中用“|”分割开的单词
- windows下盘符路径
- leetcode #41 in cpp
- 栈_数列反转
- Watch Face Complications