#include <iostream>using namespace std;#define MVNum 100                       #define MAXQSIZE 100                                    typedef char VerTexType;                      typedef int ArcType;                      bool visited[MVNum];                       typedef struct{     VerTexType vexs[MVNum];                    ArcType arcs[MVNum][MVNum];                  int vexnum,arcnum;                        }Graph;typedef struct{    ArcType *base;                                int front;                                    int rear;                            }sqQueue;void InitQueue(sqQueue &Q){    Q.base = new ArcType[MAXQSIZE];    if(!Q.base)     exit(1);                    Q.front = Q.rear = 0;}void EnQueue(sqQueue &Q, ArcType e){    if((Q.rear + 1) % MAXQSIZE == Q.front)        return;    Q.base[Q.rear] = e;    Q.rear = (Q.rear + 1) % MAXQSIZE;}bool QueueEmpty(sqQueue Q){    if(Q.rear == Q.front)        return true;    return false;}void DeQueue(sqQueue &Q, ArcType &u){    u = Q.base[Q.front];    Q.front = (Q.front + 1) % MAXQSIZE;}                                 int LocateVex(Graph G , VerTexType v){    for(int i = 0; i < G.vexnum; ++i)        if(G.vexs[i] == v)            return i;        return -1;}//创立无向图 void CreateUDG(Graph &G){     int i , j , k;    cout <<"总顶点数 总边数:";    cin >> G.vexnum >> G.arcnum;                                for(i = 0; i < G.vexnum; ++i){           cout << "第" << (i+1) << "个点的名称:";        cin >> G.vexs[i];                                    }        for(i = 0; i < G.vexnum; ++i)                                    for(j = 0; j < G.vexnum; ++j)               G.arcs[i][j] = 0;      for(k = 0; k < G.arcnum;++k){                                VerTexType v1 , v2;        cout << "第" << (k + 1) << "条边附丽的顶点:";        cin >> v1 >> v2;                                            i = LocateVex(G, v1);  j = LocateVex(G, v2);                G.arcs[j][i] = G.arcs[i][j] = 1;                    }}int FirstAdjVex(Graph G , int v){    int i;    for(i = 0 ; i < G.vexnum ; ++i){        if(G.arcs[v][i] == 1 && visited[i] == false)            return i;    }    return -1;}int NextAdjVex(Graph G , int u , int w){    int i;    for(i = w ; i < G.vexnum ; ++i){        if(G.arcs[u][i] == 1 && visited[i] == false)            return i;    }    return -1;}//广度优先遍历void BFS (Graph G, int v){     sqQueue Q;    ArcType u;    ArcType w;    cout << G.vexs[v];    visited[v] = true;                              InitQueue(Q);                                                                       EnQueue(Q, v);                                                                while(!QueueEmpty(Q)){                                                           DeQueue(Q, u);                                                               for(w = FirstAdjVex(G, u); w >= 0; w = NextAdjVex(G, u, w)){            if(!visited[w]){                                                                       cout << G.vexs[w];   visited[w] = true;                                EnQueue(Q, w);                                                            }        }    }}int main(){    Graph G;    CreateUDG(G);    cout << "遍历无向图的起始点:";    VerTexType c;    cin >> c;    int i;    for(i = 0 ; i < G.vexnum ; ++i){        if(c == G.vexs[i])            break;    }    cout << "广度优先搜寻遍历无向图:";    BFS(G , i);    return 0;}