图的遍历——广度优先遍历——邻接矩阵

来源:互联网 发布:武汉丛林网络看书 编辑:程序博客网 时间:2024/06/04 19:27
/*图的遍历——广度优先遍历——邻接矩阵*/#include<stdio.h>#include<stdlib.h>#include<time.h>#define MAXSIZE 20#define OK 1#define ERROR 0/*队列的存储结构*/typedef int Status;typedef int QElemtype;typedef struct{    QElemtype data[MAXSIZE];    int front;    int rear;}sqQueue;/*图的存储结构——邻接矩阵*/#define MAXVEX 100      /*最大顶点数*/#define INFINITY 65535      /*用65535来代表∞*/typedef char VertexType;     /*顶点*/typedef int EdgeType;   /*权值*/typedef int Boolean;    /*Boolean是布尔类型,其值为TURE和FALSE*/Boolean visited[MAXVEX];    /*访问标志的数组*/typedef struct {    VertexType vexs[MAXVEX];    /*顶点表*/    EdgeType arc[MAXVEX][MAXVEX];   /*邻接矩阵,可看作边表*/    int numVertexes,numEdge;    /*图中当前的顶点数和边数*/}MGraph;Status InitQueue(sqQueue * Q){    Q->front=0;    Q->rear=0;    return OK;}Status QueueLength(sqQueue Q){    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;}Status EnQueue(sqQueue * Q, QElemtype e){    if((Q->rear+1)%MAXSIZE==Q->front)    {        return ERROR;    }    Q->data[Q->rear]=e;    Q->rear=(Q->rear+1)%MAXSIZE;    return OK;}Status DeQueue(sqQueue * Q,QElemtype * e){    if(Q->front==Q->rear)    {        return ERROR;    }    *e=Q->data[Q->front];    Q->front=(Q->front+1)%MAXSIZE;    return OK;}/*邻接矩阵的广度优先遍历*/void BFSTraverse(MGraph G){    int i,j;    sqQueue Q;    for(i=0;i<G.numVertexes;i++)        visited[i]=false;    InitQueue(&Q);  /*初始化一辅助用的队列*/    for(i=0;i<G.numVertexes;i++)    /*对每一个顶点做循环*/    {        if(!visited[i]) /*若是未访问过的就处理*/        {            visited[i]=true;    /*设置当前顶点访问过*/            printf("%c",G.vexs[i]);             EnQueue(&Q,i);  /*将此顶点入队*/            while(QueueLength(Q)!=0)    /*若当前队列不为空*/            {                DeQueue(&Q,&i);     /*将队中的元素出队列,赋值给i*/                for(j=0;j<G.numVertexes;j++)                {                    /*判断其他顶点若与当前顶点存在边且未访问过*/                    if(G.arc[i][j]==1 && !visited[j])                    {                        visited[j]=true;    /*找到的此顶点标记为已访问*/                        printf("%c",G.vexs[j]); /*打印顶点*/                        EnQueue(&Q,j);  /*将找到的此顶点入队列*/                    }                }            }        }    }}int main(){    return 0;}
0 0
原创粉丝点击