065.图的深度优先遍利

举报
C语言与CPP编程 发表于 2022/04/30 23:59:51 2022/04/30
【摘要】 /*/*//* 图的深度优先遍历 *//*/*/#include <stdlib.h>#include <stdio.h> struct node /* 图顶点结构定义 */{...

  
  1. /*/*/
  2. /* 图的深度优先遍历 */
  3. /*/*/
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. struct node /* 图顶点结构定义 */
  7. {
  8. int vertex; /* 顶点数据信息 */
  9. struct node *nextnode; /* 指下一顶点的指标 */
  10. };
  11. typedef struct node *graph; /* 图形的结构新型态 */
  12. struct node head[9]; /* 图形顶点数组 */
  13. int visited[9]; /* 遍历标记数组 */
  14. /********************根据已有的信息建立邻接表********************/
  15. void creategraph(int node[20][2],int num)/*num指的是图的边数*/
  16. {
  17. graph newnode; /*指向新节点的指针定义*/
  18. graph ptr;
  19. int from; /* 边的起点 */
  20. int to; /* 边的终点 */
  21. int i;
  22. for ( i = 0; i < num; i++ ) /* 读取边线信息,插入邻接表*/
  23. {
  24. from = node[i][0]; /* 边线的起点 */
  25. to = node[i][1]; /* 边线的终点 */
  26. /* 建立新顶点 */
  27. newnode = ( graph ) malloc(sizeof(struct node));
  28. newnode->vertex = to; /* 建立顶点内容 */
  29. newnode->nextnode = NULL; /* 设定指标初值 */
  30. ptr = &(head[from]); /* 顶点位置 */
  31. while ( ptr->nextnode != NULL ) /* 遍历至链表尾 */
  32. ptr = ptr->nextnode; /* 下一个顶点 */
  33. ptr->nextnode = newnode; /* 插入节点 */
  34. }
  35. }
  36. /********************** 图的深度优先搜寻法********************/
  37. void dfs(int current)
  38. {
  39. graph ptr;
  40. visited[current] = 1; /* 记录已遍历过 */
  41. printf("vertex[%d]\n",current); /* 输出遍历顶点值 */
  42. ptr = head[current].nextnode; /* 顶点位置 */
  43. while ( ptr != NULL ) /* 遍历至链表尾 */
  44. {
  45. if ( visited[ptr->vertex] == 0 ) /* 如过没遍历过 */
  46. dfs(ptr->vertex); /* 递回遍历呼叫 */
  47. ptr = ptr->nextnode; /* 下一个顶点 */
  48. }
  49. }
  50. /****************************** 主程序******************************/
  51. void main()
  52. {
  53. graph ptr;
  54. int node[20][2] = { {1, 2}, {2, 1}, /* 边线数组 */
  55. {1, 3}, {3, 1},
  56. {1, 4}, {4, 1},
  57. {2, 5}, {5, 2},
  58. {2, 6}, {6, 2},
  59. {3, 7}, {7, 3},
  60. {4, 7}, {4, 4},
  61. {5, 8}, {8, 5},
  62. {6, 7}, {7, 6},
  63. {7, 8}, {8, 7} };
  64. int i;
  65. clrscr();
  66. for ( i = 1; i <= 8; i++ ) /* 顶点数组初始化 */
  67. {
  68. head[i].vertex = i; /* 设定顶点值 */
  69. head[i].nextnode = NULL; /* 指针为空 */
  70. visited[i] = 0; /* 设定遍历初始标志 */
  71. }
  72. creategraph(node,20); /* 建立邻接表 */
  73. printf("Content of the gragh's ADlist is:\n");
  74. for ( i = 1; i <= 8; i++ )
  75. {
  76. printf("vertex%d ->",head[i].vertex); /* 顶点值 */
  77. ptr = head[i].nextnode; /* 顶点位置 */
  78. while ( ptr != NULL ) /* 遍历至链表尾 */
  79. {
  80. printf(" %d ",ptr->vertex); /* 印出顶点内容 */
  81. ptr = ptr->nextnode; /* 下一个顶点 */
  82. }
  83. printf("\n"); /* 换行 */
  84. }
  85. printf("\nThe end of the dfs are:\n");
  86. dfs(1); /* 打印输出遍历过程 */
  87. printf("\n"); /* 换行 */
  88. puts(" Press any key to quit...");
  89. getch();
  90. }

文章来源: blog.csdn.net,作者:程序员编程指南,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/124495755

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。