1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAXVERTEX 10
  4. typedef char VertexType; //顶点类型
  5. typedef int EdgeType; //边的类型
  6. typedef int ElemType; //队列中元素类型
  7. typedef struct EdgeNode
  8. {
  9. int adjvex;
  10. EdgeType weight;
  11. struct EdgeNode *next;
  12. }EdgeNode; //在邻接表中存放邻接顶点下标值的结点
  13. typedef struct VertexNode
  14. {
  15. int Flag;
  16. int vertex;
  17. VertexType data;
  18. EdgeNode *firstedge;
  19. }VertexNode,AdjList[MAXVERTEX]; //定义一个MAXVERTEX个顶点的邻接表
  20. typedef struct GraphAdjList
  21. {
  22. AdjList adjList;
  23. int numVertex;
  24. int numEdge;
  25. }GraphAdjList; //定义一个图
  26.  
  27. typedef struct QNode
  28. {
  29. ElemType qData;
  30. struct QNode *nextNode;
  31. }QNode; //定义队列的结点
  32. typedef struct QueueList
  33. {
  34. QNode *front;
  35. QNode *rear;
  36. }QueueList,*queue; //定义一个队列
  37.  
  38. //初始化队列
  39. void InitQueue(QueueList *Q)
  40. {
  41. Q->front = (QNode*)malloc(sizeof(QNode));
  42. if( Q->front == NULL )
  43. {
  44. printf("Error!");
  45. exit(0);
  46. }
  47. Q->rear = Q->front;
  48. // Q->rear = NULL;
  49. Q->front->nextNode = NULL;
  50. }
  51.  
  52. //插入一个结点到队列
  53. void InsertQueue(QueueList *Q,ElemType *e)
  54. {
  55. QNode *p;
  56. p = (QNode *)malloc(sizeof(QNode));
  57. p->qData = *e;
  58. p->nextNode = NULL;
  59. Q->rear->nextNode = p;
  60. Q->rear = p;
  61. }
  62.  
  63. //删除队列中的结点(出队列)
  64. void DeleteQueue(QueueList *Q,ElemType *e)
  65. {
  66. QNode *s;
  67. if(Q->front == Q->rear)
  68. {
  69. return;
  70. }
  71. s = Q->front->nextNode;
  72. *e = s->qData;
  73. Q->front->nextNode = s->nextNode;
  74. if(Q->front->nextNode == NULL)
  75. {
  76. Q->rear = Q->front;
  77. }
  78. free(s);
  79. return;
  80. }
  81.  
  82. void CreateGraph(GraphAdjList *G) //构建一个我们要遍历的图
  83. {
  84. int i = 0,j = 0,k = 0;
  85. EdgeNode *s;
  86. VertexType c;
  87. printf("请输入图的顶点数和边数,中间用英文逗号隔开 :\n");
  88. scanf("%d,%d",&G->numVertex,&G->numEdge);
  89. printf("请输入各个顶点中存放的数据:\n");
  90. fflush(stdin);
  91. scanf("%c",&c);
  92. while(i < G->numVertex)
  93. {
  94. if(c == '\n')
  95. {
  96. break;
  97. }
  98. G->adjList[i].data = c;
  99. G->adjList[i].Flag = 0;
  100. G->adjList[i].vertex = i;
  101. G->adjList[i].firstedge = NULL;
  102. i++;
  103. scanf("%c",&c);
  104. }
  105. fflush(stdin);
  106. for(k = 0;k < G->numEdge;k++)
  107. {
  108. printf("请输入边Vi~Vj依附的顶点下标 i 和 j :\n");
  109. scanf("%d,%d",&i,&j);
  110. s = (EdgeNode*)malloc(sizeof(EdgeNode));
  111. s->adjvex = j;
  112. s->next = G->adjList[i].firstedge;
  113. G->adjList[i].firstedge = s;
  114. s = (EdgeNode*)malloc(sizeof(EdgeNode));
  115. s->adjvex = i;
  116. s->next = G->adjList[j].firstedge;
  117. G->adjList[j].firstedge = s;
  118. }
  119. }
  120. //查看邻接表是否构建的正确,这个函数只是为了验证
  121. void print(GraphAdjList *G)
  122. {
  123. int i = 0;
  124. EdgeNode *p;
  125. for(i = 0;i < G->numVertex;i++)
  126. {
  127. printf("\n %d->",i);
  128. p = G->adjList[i].firstedge;
  129. while(p)
  130. {
  131. printf("%d->",p->adjvex);
  132. p = p->next;
  133. }
  134. printf("End\n");
  135. }
  136. }
  137.  
  138. //DFS遍历
  139. void DFSTraverse(GraphAdjList *G,int i)
  140. {
  141. int j = 0;
  142. EdgeNode *p;
  143. G->adjList[i].Flag = 1;
  144. printf("%c->",G->adjList[i].data);
  145. p = G->adjList[i].firstedge;
  146. while(p != NULL)
  147. {
  148. if(G->adjList[p->adjvex].Flag == 0)
  149. {
  150. DFSTraverse(G,p->adjvex);
  151. }
  152. p = p->next;
  153. }
  154. }
  155. //判断队列是否为空
  156. int QueueEmpty(QueueList *Q)
  157. {
  158. if(Q->front == Q->rear)
  159. return 0;
  160. else
  161. return 1;
  162. }
  163. //BFS遍历
  164. void BFSTraverse(GraphAdjList *G)
  165. {
  166. int i = 0,k = 0,flag = 0;
  167. EdgeNode *s;
  168. QueueList Q;
  169. InitQueue(&Q);
  170. for(i = 0;i < G->numVertex;i++)
  171. {
  172. G->adjList[i].Flag = 0;
  173. }
  174. for(i = 0;i < G->numVertex;i++)
  175. {
  176. if(G->adjList[i].Flag == 0)
  177. {
  178. G->adjList[i].Flag = 1;
  179. // printf("%c ",G->adjList[i].data);
  180. InsertQueue(&Q,&i);
  181. while(QueueEmpty(&Q))
  182. {
  183. DeleteQueue(&Q,&i);
  184. printf("%c->",G->adjList[i].data);
  185. s = G->adjList[i].firstedge;
  186. while(s != NULL)
  187. {
  188. k = s->adjvex;
  189. if(G->adjList[k].Flag == 0)
  190. {
  191. G->adjList[k].Flag = 1;
  192. // printf("%c ",G->adjList[k].data);
  193. InsertQueue(&Q,&(s->adjvex));
  194. }
  195. s = s->next;
  196. }
  197.  
  198. }
  199. }
  200. }
  201. printf("End\n");
  202. }
  203.  
  204. int main()
  205. {
  206. int k = 0; //深度优先遍历从第1个顶点(按输入顺序)开始
  207. GraphAdjList *G;
  208. CreateGraph(G);
  209. printf("\n顶点的邻接表为:\n");
  210. print(G); //按照头插法得到的邻接表
  211. printf("\nDFS的结果是:\n");
  212. DFSTraverse(G,k); //深度优先遍历
  213. printf("End\n");
  214. printf("\nBFS的结果是:\n");
  215. BFSTraverse(G); //广度优先遍历
  216. return;
  217. }

  

用邻接表实现DFS和BFS的更多相关文章

  1. PAT1013. Battle Over Cities(邻接矩阵、邻接表分别dfs)

    //采用不同的图存储结构结构邻接矩阵.邻接表分别dfs,我想我是寂寞了吧,应该试试并查集,看见可以用并查集的就用dfs,bfs代替......怕了并查集了 //邻接矩阵dfs #include< ...

  2. JAVA实现图的邻接表以及DFS

    一:定义邻接表结构储存图 package 图的遍历; //邻接表实现图的建立 //储存边 class EdgeNode { int index; // 习惯了用index,其实标准写法是(adjVer ...

  3. All Roads Lead to Rome(30)(MAP【int,string】,邻接表,DFS,模拟,SPFA)(PAT甲级)

    #include<bits/stdc++.h>using namespace std;map<string,int>city;map<int,string>rcit ...

  4. POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)

    题目链接: https://cn.vjudge.net/problem/POJ-1724 N cities named with numbers 1 ... N are connected with ...

  5. 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)

    邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...

  6. 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS

    图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...

  7. 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)

    数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...

  8. 邻接表实现Dijkstra算法以及DFS与BFS算法

    //============================================================================ // Name : ListDijkstr ...

  9. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

随机推荐

  1. XML.ObjTree -- XML source code from/to JavaScript object like E4X

    转载于:http://www.kawa.net/works/js/xml/objtree-try-e.html // ========================================= ...

  2. Android开发中一些常见的问题解决方案

    分享一下自己开发中遇到的一些常见问题及解决方案,方面以后快速开发少走弯路,也可以供大家一起学习. 1.开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listvie ...

  3. 简单的oracle sql 语句

    创建表空间 create tablespace qnhouse --表空间文件路径 datafile 'E:\qnhost\qnhouse.dbf' --表空间文件大小 size 100M; 创建用户 ...

  4. 【Remoting-4】

    [服务对象三种激活方式的不同] [1]客户端激活方式 [A]对象的创建,对象方法的执行都是在远程服务端. [B]服务端为每一个客户端创建其专属的对象,为这个客户提供服务,并且保存状态 [C]可以从远程 ...

  5. hdu2304Electrical Outlets

    Problem Description Roy has just moved into a new apartment. Well, actually the apartment itself is ...

  6. LInux系统及其文件系统

    Linux系统:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协 ...

  7. R - 递推

    Description          我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平 ...

  8. Android 开发使用lambda实现< JDK8兼容

    代码精简无疑是每个程序员的目标,简短易读.java 8中的lambda表达式的使用: 4 easy steps Download and install jdk8. Add the following ...

  9. 纯CSS3技术 加载中

    你能相信吗?这些都是由一个DIV元素实现的动画,纯CSS3技术 html  <div class="loader">加载中...</div> css: 图( ...

  10. 新版703n刷openwrt

    自带的官方固件: 3.17.1 Build 140120 Rel.56593n WR703N v1 00000000 在不能web页面刷固件,因为带了校验功能. 老外给出了不上TTL刷路由的方法: h ...