当前位置:   article > 正文

严蔚敏数据结构图的深度与广度优先遍历_数据结构严蔚敏c语言版图广度优先

数据结构严蔚敏c语言版图广度优先

 头文件Graph.h

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define OK 1
  4. #define INFINITY 32767
  5. #define MAX_VERTEX_NUM 30
  6. #define MAXINFOLEN 30
  7. #define ERROR 0
  8. #define OVERFLOW -1
  9. #define MAXVERTEXLEN 30
  10. #define FALSE 0
  11. #define TRUE 1
  12. typedef int Status;
  13. typedef enum { DG, DN, UDG, UDN }GraphKind;
  14. typedef int VRType;
  15. typedef int InfoType;
  16. typedef char* VertexType;
  17. typedef struct ArcCell
  18. {
  19. VRType adj;
  20. InfoType* info;
  21. }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
  22. typedef struct
  23. {
  24. VertexType vexs[MAX_VERTEX_NUM];
  25. AdjMatrix arcs;
  26. int vexnum, arcnum;
  27. GraphKind kind;
  28. }MGraph;
  29. Status CreatGraph(MGraph* G)
  30. {
  31. printf("请输入图的类型\n");
  32. scanf("%d", &(G->kind));
  33. switch (G->kind)
  34. {
  35. case DG:return(CreatDG(G)); break;
  36. case DN:return(CreatDN(G)); break;
  37. case UDG:return(CreatUDG(G)); break;
  38. case UDN:return(CreatUDN(G)); break;
  39. default: return ERROR;
  40. }
  41. }
  42. Status CreatDG(MGraph* G)
  43. {
  44. printf("请依次输入图的总结点数,弧数,以及是弧是否需要额外信息,无额外信息输入0,有额外信息输入1\n");
  45. int info;
  46. scanf("%d%d%d", &(G->vexnum), &(G->arcnum), &info);
  47. getchar();
  48. printf("请输入%d个顶点的描述\n", G->vexnum);
  49. for (int i = 0; i < G->vexnum; i++)
  50. {
  51. G->vexs[i] = (VertexType)malloc(sizeof(char) * MAXVERTEXLEN);
  52. if (!G->vexs[i]) exit(OVERFLOW);
  53. gets(G->vexs[i]);
  54. }
  55. for(int i=0;i<G->vexnum;i++)
  56. for (int j = 0; j < G->vexnum; j++)
  57. {
  58. G->arcs[i][j].adj = 0;
  59. G->arcs[i][j].info = NULL;
  60. }
  61. int tail, head;
  62. char* ch;
  63. ch = (char*)malloc(sizeof(char) * MAXVERTEXLEN);
  64. if (!ch) exit(OVERFLOW);
  65. for (int i = 0; i < G->arcnum; i++)
  66. {
  67. printf("请输入第%d个顶点关系\n", i + 1);
  68. printf("请输入它的弧尾顶点描述\n");
  69. gets(ch);
  70. for (int j = 0; j < G->vexnum; j++)
  71. if (strcmp(ch, G->vexs[j]) == 0)
  72. {
  73. tail = j;
  74. break;
  75. }
  76. printf("请输入它的弧头顶点描述\n");
  77. gets(ch);
  78. for (int j = 0; j < G->vexnum; j++)
  79. if (strcmp(ch, G->vexs[j]) == 0)
  80. {
  81. head = j;
  82. break;
  83. }
  84. G->arcs[tail][head].adj = 1;
  85. if (info)
  86. {
  87. G->arcs[tail][head].info = (InfoType*)malloc(sizeof(InfoType) * MAXINFOLEN);
  88. if (!G->arcs[tail][head].info) exit(OVERFLOW);
  89. printf("请输入其信息\n");
  90. gets(G->arcs[tail][head].info);
  91. }
  92. }
  93. return OK;
  94. }
  95. Status CreatDN(MGraph* G)
  96. {
  97. printf("请依次输入图的总结点数,弧数,以及是弧是否需要额外信息,无额外信息输入0,有额外信息输入1\n");
  98. int info;
  99. scanf("%d%d%d", &(G->vexnum), &(G->arcnum), &info);
  100. getchar();
  101. printf("请输入%d个顶点的描述\n", G->vexnum);
  102. for (int i = 0; i < G->vexnum; i++)
  103. {
  104. G->vexs[i] = (VertexType)malloc(sizeof(char) * MAXVERTEXLEN);
  105. if (!G->vexs[i]) exit(OVERFLOW);
  106. gets(G->vexs[i]);
  107. }
  108. for (int i = 0; i < G->vexnum; i++)
  109. for (int j = 0; j < G->vexnum; j++)
  110. {
  111. G->arcs[i][j].adj = INFINITY;
  112. G->arcs[i][j].info = NULL;
  113. }
  114. int tail, head;
  115. char* ch;
  116. ch = (char*)malloc(sizeof(char) * MAXVERTEXLEN);
  117. if (!ch) exit(OVERFLOW);
  118. for (int i = 0; i < G->arcnum; i++)
  119. {
  120. printf("请输入第%d个顶点关系\n", i + 1);
  121. printf("请输入它的弧尾顶点描述\n");
  122. gets(ch);
  123. for (int j = 0; j < G->vexnum; j++)
  124. if (strcmp(ch, G->vexs[j]) == 0)
  125. {
  126. tail = j;
  127. break;
  128. }
  129. printf("请输入它的弧头顶点描述\n");
  130. gets(ch);
  131. for (int j = 0; j < G->vexnum; j++)
  132. if (strcmp(ch, G->vexs[j]) == 0)
  133. {
  134. head = j;
  135. break;
  136. }
  137. printf("请输入弧的权值\n");
  138. scanf("%d", &(G->arcs[tail][head]));
  139. getchar();
  140. if (info)
  141. {
  142. G->arcs[tail][head].info = (InfoType*)malloc(sizeof(InfoType) * MAXINFOLEN);
  143. if (!G->arcs[tail][head].info) exit(OVERFLOW);
  144. printf("请输入其信息\n");
  145. gets(G->arcs[tail][head].info);
  146. }
  147. }
  148. return OK;
  149. }
  150. Status CreatUDG(MGraph* G)
  151. {
  152. printf("请依次输入图的总结点数,弧数,以及是弧是否需要额外信息,无额外信息输入0,有额外信息输入1\n");
  153. int info;
  154. scanf("%d%d%d", &(G->vexnum), &(G->arcnum), &info);
  155. getchar();
  156. printf("请输入%d个顶点的描述\n", G->vexnum);
  157. for (int i = 0; i < G->vexnum; i++)
  158. {
  159. G->vexs[i] = (VertexType)malloc(sizeof(char) * MAXVERTEXLEN);
  160. if (!G->vexs[i]) exit(OVERFLOW);
  161. gets(G->vexs[i]);
  162. }
  163. for (int i = 0; i < G->vexnum; i++)
  164. for (int j = 0; j < G->vexnum; j++)
  165. {
  166. G->arcs[i][j].adj = 0;
  167. G->arcs[i][j].info = NULL;
  168. }
  169. int vex1, vex2;
  170. char* ch;
  171. ch = (char*)malloc(sizeof(char) * MAXVERTEXLEN);
  172. if (!ch) exit(OVERFLOW);
  173. for (int i = 0; i < G->arcnum; i++)
  174. {
  175. printf("请输入第%d个顶点关系\n", i + 1);
  176. printf("请输入它所依附的第一个顶点的顶点描述\n");
  177. gets(ch);
  178. for (int j = 0; j < G->vexnum; j++)
  179. if (strcmp(ch, G->vexs[j]) == 0)
  180. {
  181. vex1 = j;
  182. break;
  183. }
  184. printf("请输入它所依附的第二个顶点的顶点描述\n");
  185. gets(ch);
  186. for (int j = 0; j < G->vexnum; j++)
  187. if (strcmp(ch, G->vexs[j]) == 0)
  188. {
  189. vex2 = j;
  190. break;
  191. }
  192. G->arcs[vex1][vex2].adj = 1;
  193. G->arcs[vex2][vex1].adj = 1;
  194. if (info)
  195. {
  196. G->arcs[vex1][vex2].info = (InfoType*)malloc(sizeof(InfoType) * MAXINFOLEN);
  197. if (!G->arcs[vex1][vex2].info) exit(OVERFLOW);
  198. printf("请输入其信息\n");
  199. gets(G->arcs[vex1][vex2].info);
  200. G->arcs[vex2][vex1].info = (InfoType*)malloc(sizeof(InfoType) * MAXINFOLEN);
  201. if (!G->arcs[vex2][vex1].info) exit(OVERFLOW);
  202. strcpy(G->arcs[vex2][vex1].info, G->arcs[vex1][vex2].info);
  203. }
  204. }
  205. return OK;
  206. }
  207. Status CreatUDN(MGraph* G)
  208. {
  209. printf("请依次输入图的总结点数,弧数,以及是弧是否需要额外信息,无额外信息输入0,有额外信息输入1\n");
  210. int info;
  211. scanf("%d%d%d", &(G->vexnum), &(G->arcnum), &info);
  212. getchar();
  213. printf("请输入%d个顶点的描述\n", G->vexnum);
  214. for (int i = 0; i < G->vexnum; i++)
  215. {
  216. G->vexs[i] = (VertexType)malloc(sizeof(char) * MAXVERTEXLEN);
  217. if (!G->vexs[i]) exit(OVERFLOW);
  218. gets(G->vexs[i]);
  219. }
  220. for (int i = 0; i < G->vexnum; i++)
  221. for (int j = 0; j < G->vexnum; j++)
  222. {
  223. G->arcs[i][j].adj = INFINITY;
  224. G->arcs[i][j].info = NULL;
  225. }
  226. int vex1, vex2;
  227. char* ch;
  228. ch = (char*)malloc(sizeof(char) * MAXVERTEXLEN);
  229. if (!ch) exit(OVERFLOW);
  230. for (int i = 0; i < G->arcnum; i++)
  231. {
  232. printf("请输入第%d个顶点关系\n", i + 1);
  233. printf("请输入它所依附的第一个顶点的顶点描述\n");
  234. gets(ch);
  235. for (int j = 0; j < G->vexnum; j++)
  236. if (strcmp(ch, G->vexs[j]) == 0)
  237. {
  238. vex1 = j;
  239. break;
  240. }
  241. printf("请输入它所依附的第二个顶点的顶点描述\n");
  242. gets(ch);
  243. for (int j = 0; j < G->vexnum; j++)
  244. if (strcmp(ch, G->vexs[j]) == 0)
  245. {
  246. vex2 = j;
  247. break;
  248. }
  249. printf("请输入此弧权值\n");
  250. scanf("%d", &(G->arcs[vex1][vex2].adj));
  251. getchar();
  252. G->arcs[vex2][vex1].adj = G->arcs[vex1][vex2].adj;
  253. if (info)
  254. {
  255. G->arcs[vex1][vex2].info = (InfoType*)malloc(sizeof(InfoType) * MAXINFOLEN);
  256. if (!G->arcs[vex1][vex2].info) exit(OVERFLOW);
  257. printf("请输入其信息\n");
  258. gets(G->arcs[vex1][vex2].info);
  259. G->arcs[vex2][vex1].info = (InfoType*)malloc(sizeof(InfoType) * MAXINFOLEN);
  260. if (!G->arcs[vex2][vex1].info) exit(OVERFLOW);
  261. strcpy(G->arcs[vex2][vex1].info, G->arcs[vex1][vex2].info);
  262. }
  263. }
  264. return OK;
  265. }
  266. //孩子兄弟树的数据结构描述
  267. typedef char* TElemType;
  268. typedef struct CSNode
  269. {
  270. TElemType data;
  271. struct CSNode* firstchild, * nextsibling;
  272. }CSNode, * CSTree;
  273. //队列函数
  274. typedef CSTree QElemType;
  275. typedef struct QNode
  276. {
  277. QElemType data;
  278. struct QNode* next;
  279. }QNode, * QueuePtr;
  280. typedef struct
  281. {
  282. QueuePtr front, rear;
  283. }LinkQueue;
  284. Status InitQueue(LinkQueue* Q)
  285. {
  286. Q->front = (QNode*)malloc(sizeof(QNode));
  287. if (!Q->front) exit(OVERFLOW);
  288. Q->rear = Q->front;
  289. return OK;
  290. }
  291. Status EnQueue(LinkQueue* Q, QElemType e)
  292. {
  293. QNode* p;
  294. p = (QNode*)malloc(sizeof(QNode));
  295. if (!p) exit(OVERFLOW);
  296. p->data = e;
  297. Q->rear->next = p;
  298. Q->rear = p;
  299. p->next = NULL;
  300. return OK;
  301. }
  302. Status DeQueue(LinkQueue* Q, QElemType* e)
  303. {
  304. if (Q->front == Q->rear)
  305. return ERROR;
  306. *e = Q->front->next->data;
  307. if (Q->rear == Q->front->next)
  308. Q->rear = Q->front;
  309. QNode* p = Q->front->next;
  310. Q->front->next = p->next;
  311. free(p);
  312. return OK;
  313. }
  314. Status QueueEmpty(LinkQueue Q)
  315. {
  316. if (Q.front == Q.rear)
  317. return TRUE;
  318. else
  319. return FALSE;
  320. }
  321. void PrintQueue(LinkQueue Q)
  322. {
  323. QNode* p = Q.front->next;
  324. if (!p)
  325. printf("空\n");
  326. else
  327. {
  328. while (p)
  329. {
  330. printf("%d\t", p->data + 1);
  331. p = p->next;
  332. }
  333. printf("\n");
  334. }
  335. }

c文件:

  1. #include "Graph.h"
  2. Status PutString(VertexType v)
  3. {
  4. puts(v);
  5. return OK;
  6. }
  7. //图的深度优先遍历,邻接矩阵存储图
  8. int visited[MAX_VERTEX_NUM];
  9. void DFS(MGraph G, int w, Status(*Visit)(VertexType e))
  10. {
  11. visited[w] = TRUE;
  12. Visit(G.vexs[w]);
  13. for (int v = 0; v < G.vexnum; v++)
  14. {
  15. if (!visited[v] && G.arcs[w][v].adj == 1)
  16. DFS(G, v, Visit);
  17. }
  18. }
  19. void DFSTraverse(MGraph G, Status(*Visit)(VertexType e))
  20. {
  21. for (int i = 0; i < G.vexnum; i++)
  22. visited[i] = FALSE;
  23. for (int i = 0; i < G.vexnum; i++)
  24. {
  25. if (!visited[i])
  26. DFS(G, i, Visit);
  27. }
  28. return OK;
  29. }
  30. //广度优先遍历邻接矩阵存储图
  31. void BFSTraverse(MGraph G, Status(*Visit)(VertexType e))
  32. {
  33. LinkQueue* Q;
  34. Q = (LinkQueue*)malloc(sizeof(LinkQueue));
  35. if (!Q) exit(OVERFLOW);
  36. InitQueue(Q);
  37. for (int i = 0; i < G.vexnum; i++)
  38. visited[i] = FALSE;
  39. for (int i = 0; i < G.vexnum; i++)
  40. {
  41. if (!visited[i])
  42. {
  43. Visit(G.vexs[i]);
  44. visited[i] = TRUE;
  45. EnQueue(Q, i);
  46. while (!QueueEmpty(*Q))
  47. {
  48. int k;
  49. DeQueue(Q, &k);
  50. for (int j = 0; j < G.vexnum; j++)
  51. {
  52. if (!visited[j] && G.arcs[k][j].adj)
  53. {
  54. EnQueue(Q, j);
  55. Visit(G.vexs[j]);
  56. visited[j] = TRUE;
  57. }
  58. }
  59. }
  60. }
  61. }
  62. }
  63. int main()
  64. {
  65. MGraph G;
  66. CreatGraph(&G);
  67. printf("\t");
  68. for (int i = 0; i < G.vexnum; i++)
  69. printf("V%d\t", i + 1);
  70. printf("\n\n");
  71. for (int i = 0; i < G.vexnum; i++)
  72. {
  73. printf("V%d\t", i + 1);
  74. for (int j = 0; j < G.vexnum; j++)
  75. printf("%d\t", G.arcs[i][j].adj);
  76. printf("\n\n\n");
  77. }
  78. Status* Visit;
  79. Visit = PutString;
  80. printf("深度优先遍历结果为:\n");
  81. DFSTraverse(G, Visit);
  82. printf("广度优先遍历结果为:\n");
  83. BFSTraverse(G, Visit);
  84. return 0;
  85. }

输入:

  1. 2
  2. 8 9 0
  3. V1
  4. V2
  5. V3
  6. V4
  7. V5
  8. V6
  9. V7
  10. V8
  11. V1
  12. V2
  13. V1
  14. V3
  15. V2
  16. V4
  17. V2
  18. V5
  19. V4
  20. V8
  21. V5
  22. V8
  23. V3
  24. V6
  25. V3
  26. V7
  27. V6
  28. V7

 原图:

 领接矩阵:

结果: 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/820761
推荐阅读
相关标签
  

闽ICP备14008679号