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. 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现

    邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...

  2. 数据结构——图的邻接表存储

    数据结构--图的邻接表存储 功能实现: (1)图的邻接矩阵的储存 (2)深度优先遍历 (3).广度优先遍历 (4)求结点的度 (5)判断图是否连通 (6)求最小生成树 参考代码 #include &l ...

  3. 图的邻接表存储实现(第七章 P163)

    图的邻接表存储结构: 下图分别是有向图和无向网的的邻接表存储结构.要注意的是,为了提高效率,程序中的基本操作函数 CreateGraph()产生链表时总是在表头插入结点. 所以,对于给定的图,即使它的 ...

  4. mysql 邻接表_图的邻接表存储结构详解

    通常,图更多的是采用链表存储,具体的存储方法有 3 种,分别是邻接表.邻接多重表和十字链表. 本节先讲解图的邻接表存储法.邻接表既适用于存储无向图,也适用于存储有向图. 在具体讲解邻接表存储图的实现方 ...

  5. 图的邻接表存储及基本操作

    图的存储方式有很多种,这里是以邻接表存储为例实现的.图的基本操作包括初始化一个空图.插入一节点.插入条边.深度优先遍历.广度优先遍历.销毁图等 #include<stdio.h> #inc ...

  6. java邻接图_Java数据结构 - 图(邻接表存储)

    邻接表 相比邻接矩阵,邻接表要更加节省空间. 邻接表存储 本文将介绍邻接表存储有向带权图.图的例子如下. 图 介绍一下邻接表 上面的图对应的邻接表如下图所示: 邻接表 前面的数组存储的是所有的顶点,每 ...

  7. 【数据结构/C语言版】【图】邻接表存储

    邻接表 邻接表由第一数列的表头和每个表头对应连接的链表构成.每一个表头都是一个单链表表头.表头作为出发点,其链表内元素就是出发点可直接到达的目标点(也可以附加边权). 图邻接表存储优势: 1.支持有向 ...

  8. 分别采用深度优先遍历和广度优先遍历判断是否存在由vi到vj的路径,图用邻接表存储

    分析:         采用深度优先:我们从vi顶点开始进行深度遍历,若存在路径则必然可以走到vj顶点处:         采用广度优先:同样从vi顶点开始进行广度遍历,若存在则必然可以走到vj顶点处 ...

  9. 图采用邻接表存储,设计一个算法,判断顶点i和顶点j(i!=j)之间是否有路径

    算法思想:只要以i为起点,进行遍历,只要遍历过程中遇到了j,就证明有路径. 算法代码 int DFSTravel(AGraph *G,int i,int j) {int k;for(k=0;k< ...

最新文章

  1. 桥接模式和路由模式区别_【微课堂】路由器设置:桥接模式vs路由模式
  2. 磁盘文件目录罗列和list控件的使用
  3. 科学家利用脑机接口让患者正常发声
  4. Android常用权限
  5. 不一样的视角,程序员世界里的环保
  6. 程序员们怎么过端午?你属于哪一款?
  7. 嵌入式linux使用opencv,OpenCV嵌入式移植后XML读取问题及解决
  8. sqlserver 组内排序
  9. [Java] 集合类(List、Set、Map的基本使用)
  10. LayaAir UI 组件 # RadioGroup 单选框按钮组
  11. @my_decorator
  12. c 创建mysql实体模型_ADO.Net实体数据模型添加DB-First/Code First报错
  13. 解决webSocket不兼容IE浏览器问题
  14. Minecraft Forge 安装
  15. Robomaster视觉教程(二)Win10+VS201x+Opencv3.4.x环境搭建
  16. 简书的css排版,浅谈前端(WEB)排版
  17. 最佳Icon图标库推荐,收藏等于学会
  18. 麒麟处理器是基于arm的吗_直接采用ARM的CPU和GPU,那么麒麟芯片算自研吗?
  19. matlab数学建模-神经网络感知器函数
  20. 用python做股市数据分析一_用python做股票数据分析(兴趣篇)

热门文章

  1. 局部特征(local feature)
  2. 2021MIT博士pluskid年终总结
  3. 你真的会玩SQL吗?内连接、外连接
  4. 一道面试题引发的对JavaScript类型转换的思考
  5. 深入理解java虚拟机 精华总结(面试)
  6. 编程之美-判断两个链表是否相交方法整理
  7. 大话设计模式(十三 有了门面,程序员的程序会更加体面!)
  8. 动手---sbt(2)
  9. crossplatform---Nodejs in Visual Studio Code 01.简单介绍Nodejs
  10. 关于java中的main方法的几种写法