BFS

算法:

  1. #define MAXSIZE 100
  2. bool visited[MAXSIZE]; //访问数组,用来记录各个顶点是否被访问过;
  3. //v: 调用本函数,用来访问第v个顶点的下标;
  4. void BFS(Graph G, int v)
  5. {
  6. //定义一个指向边表的临时指针:
  7. ArcNode *p;
  8. //初始化队列:
  9. InitQueue(Q);
  10. //访问: 伪代码 E.g printf
  11. visit(v);
  12. //表示下标为v对应的顶点被访问过了:
  13. visited[v] = TRUE;
  14. //入队: 目的是在下面的循环中遍历该v对应的结点对应的所有结点
  15. EnQueue(Q,v);
  16. //如果队列不为空:
  17. //该队列存在的意义:将队列中每个顶点对应的下个顶点的所有结点访问完毕
  18. while(!isEmpty(Q))
  19. {
  20. //出队: 将队列中存放的结点所在的数组中的下标给临时变量v.
  21. DeQueue(Q,v);
  22. //获取图G中数组adjList下标为v值的顶点的第1条边,把该边的地址赋值给临时变量p:
  23. p = G->adjList[v].firstedge;
  24. //如果该p指向的顶点的地址存在:
  25. while(p)
  26. {
  27. //如果该p指向的顶点对应的visited数组对应的标记不是0(即没有被访问)的话:
  28. if(!visited[p->adjvex])
  29. {
  30. //访问:
  31. visit(p->adjvex);
  32. //标记该顶点访问过了:
  33. visted[p->adjvex] = TRUE;
  34. //将该顶点入栈: 实际上最坏的情况,将连通图中每个有关系的结点都入队了 ^_^
  35. EnQueue(Q,p->adjvex);
  36. }
  37. //让p指向当前顶点的下个顶点:
  38. p = p->next;
  39. }
  40. }
  41. }

举例: 5.3 - 图1

DFS

  1. #define MAXSIZE 100
  2. bool visited[MAXSIZE]; //访问数组,用来记录各个顶点是否被访问过;
  3. //v: 调用本函数,用来访问第v个顶点的下标;
  4. void DFS(Graph G, int v)
  5. {
  6. //定义一个指向边表的临时指针:
  7. ArcNode *p;
  8. //初始化队列:
  9. InitQueue(Q);
  10. //访问: 伪代码 E.g printf
  11. visit(v);
  12. //表示下标为v对应的顶点被访问过了:
  13. visited[v] = TRUE;
  14. p=G->adjlist[v].firstarc; //指针p开始指向该顶点的第一条边
  15. //如果p指向的结点地址存在的话:
  16. while(p!=NULL)
  17. {
  18. //没遍历完顶点的所有邻接顶点:
  19. if(!visited[p->adjvex])
  20. {
  21. //如果该顶点没被访问,那么就递归访问该顶点
  22. DFS(G,p->adjvex);
  23. }
  24. p=p->nextarc; //看还有没有其他未访问的顶点
  25. }
  26. }
  1. void DFSTraverse(Graph G)
  2. {
  3. int i; //单独定义是为了方便多个循环中使用
  4. for(i=0; i<G->vexnum; i++)
  5. {
  6. visited[i]=false; //将标志数组初始化 (全局数组)
  7. }
  8. for(i=0; i<G->vexnum; i++)
  9. {
  10. if(!visited[i])
  11. {
  12. DFS(G,i); //对所有
  13. }
  14. }
  15. }

5.3 - 图2