算法:图的广度优先遍历(Breadth First Search)

时间:2025-04-22 21:51:58
typedef  char VertexType;  /* 顶点类型应由用户定义 */
typedef  int EdgeType;  /* 边上的权值类型应由用户定义 */

#define MAXSIZE  9  /* 存储空间初始分配量 */
#define MAXEDGE  15
#define MAXVEX  9

/* 邻接表结构****************** */
typedef  struct EdgeNode  /* 边表结点 */
{
     int adjvex;     /* 邻接点域,存储该顶点对应的下标 */
     int weight;      /* 用于存储权值,对于非网图可以不需要 */
     struct EdgeNode *next;  /* 链域,指向下一个邻接点 */
} EdgeNode;

typedef  struct VertexNode  /* 顶点表结点 */
{
     int in;  //结点入度
     char data;  /* 顶点域,存储顶点信息 */
    EdgeNode *firstedge; /* 边表头指针 */
} VertexNode, AdjList[MAXVEX];

typedef  struct
{
    AdjList adjList;
     int numVertexes, numEdges;  /* 图中当前顶点数和边数 */
} graphAdjList, *GraphAdjList;

/* 邻接表的广度遍历算法 */
void BFSTraverse(GraphAdjList GL)
{
     int i, j;
    EdgeNode *p;
    Queue Q;
     for (i =  0; i < GL->numVertexes; i++)
        visited[i] =  false;
    InitQueue(&Q); /* 初始化一辅助用的队列 */

     for (i =  0; i < GL->numVertexes; i++) /* 对每一个顶点做循环 */
    {
         if (!visited[i]) /* 若是未访问过就处理 */
        {
            visited[i] =  true; /* 设置当前顶点访问过 */
            cout << GL->adjList[i].data <<  ' '/* 打印顶点,也可以其它操作 */
            EnQueue(&Q, i); /* 将此顶点入队列 */
             while (!QueueEmpty(Q)) /* 若当前队列不为空 */
            {
                DeQueue(&Q, &i); /* 将队对元素出队列,赋值给i */
                p = GL->adjList[i].firstedge; /* 找到当前顶点的边表链表头指针 */

                 while (p)
                {
                     /* 判断其它顶点若与当前顶点存在边且未访问过  */
                     if (!visited[p->adjvex])
                    {
                        visited[p->adjvex] =  true; /* 将找到的此顶点标记为已访问 */
                        cout << GL->adjList[p->adjvex].data <<  ' '/* 打印顶点 */
                        EnQueue(&Q, p->adjvex); /* 将找到的此顶点入队列  */
                    }
                    p  = p->next; /* 指针指向下一个邻接点 */
                }
            }
        }
    }
}