广度优先遍历无向图

#include<stdio.h>
#include<stdlib.h>


#define MAX_VERTEX_NUM 20
#define MAXQSIZE 100
#define OK 1
typedef char VertexType;
typedef char QElemType;
typedef int InfoType;


typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *nextarc;
    InfoType *info;
}ArcNode;


typedef struct VNode
{
    VertexType data;
    ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];


typedef struct{
 AdjList vertices;
 int vexnum,arcnum;
 int kind;
 }ALGraph;


 typedef struct SqQueue
 {
     QElemType *base;
     int front;
     int rear;
 }SqQueue;


 //返回顶点v在图顶点向量中的位置
 int LocateVex(ALGraph G,char v)
 {   int i;
     for(int i=0;v!=G.vertices[i].data&&i<G.vexnum;++i);
     if(i>=G.vexnum)
     return -1;
     return i;
 }
 //建立无向图邻接链表
 void creatUDG(ALGraph &G)
 {
     int i,j;
     char v1,v2;
     ArcNode *s,*t;
     printf("输入无向图的顶点数:");
     scanf("%d",&G.vexnum);
     printf("输入无向图的边数:");
     scanf("%d",&G.arcnum);
     for(i=0;i<G.vexnum;i++)
     {
         printf("输入第%d的顶点的信息:",i+1);
         scanf("%s",&G.vertices[i].data);
         G.vertices[i].firstarc=NULL;
     }
     for(int i1=0;i1<G.arcnum;i1++)//该弧所指的顶点的位置
     {
         printf("输入第%d条边依附的第一个顶点:",i1+1);
         scanf("%s",&v1);
         printf("输入第%d条边依附的第二个顶点:",i1+1);
         scanf("%s",&v2);
         i=LocateVex(G,v1);
         j=LocateVex(G,v2);
         s=(ArcNode *)malloc(sizeof(ArcNode));
         t=(ArcNode *)malloc(sizeof(ArcNode));
         s->adjvex=j;//弧所指的顶点的位置为j
         s->nextarc=G.vertices[i].firstarc;
         G.vertices[i].firstarc=s;
         t->adjvex=i;//弧所指的顶点的位置为j
         t->nextarc=G.vertices[j].firstarc;
         G.vertices[j].firstarc=t;
     }
    }
    //初始化辅助队列
    int InitQueue(SqQueue &Q)
    {
     Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
     if(!Q.base)
     {
         printf("分配地址失败!");
         return 0;
     }
     Q.front=Q.rear=0;
     return(OK);
    }
    //以访问顶点入队
    int EnQueue(SqQueue &Q,QElemType e)
    {
        if((Q.rear+1)%MAXQSIZE==Q.front)//队列已满
        {
            printf("队列已满!");
            return 0;
        }
        Q.base[Q.rear]=e;
        Q.rear=(Q.rear+1)%MAXQSIZE;
        return(OK);
    }
    //判断是否为空
    int QueueEmpty(SqQueue Q)
    {
        if(Q.front==Q.rear)
        return(OK);
        else
        return(0);
    }
    //辅助队列对头顶点出队
    char DeQueue(SqQueue &Q)
    {
        QElemType e;
        if(Q.front==Q.rear)
        {
            printf("队列为空!");
            return 0;
        }
        e=Q.base[Q.front];
        Q.front=(Q.front+1)%MAXQSIZE;
        return(e);
    }


        //广度优先非递归遍历图G
        void BFSTraverse(ALGraph G)
        {
        int v,w,u;
        char e;
        ArcNode *s;
        int visited[MAX_VERTEX_NUM];//访问标志数组
        SqQueue Q;//遍历辅助队列
        for(v=0;v<G.vexnum;++v)
        visited[v]=0;//初始化标志数组visited[]
        InitQueue(Q);//初始化队列
        for(v=0;v<G.vexnum;++v)
        if(visited[v]==0)//尚未访问的点
        {
            visited[v]=1;
            printf("%c->",G.vertices[v].data);
            EnQueue(Q,G.vertices[v].data);//已访问顶点入队
            while(!QueueEmpty(Q))//辅助队列非空
            {
                e=DeQueue(Q);//返回辅助队列队头顶点
                u=LocateVex(G,e);
                s=(ArcNode*)malloc(sizeof(ArcNode));
                s=G.vertices[u].firstarc;
                while(s!=NULL)//顶点e还有邻接顶点
                {
                    w=s->adjvex;
                    if(visited[w]==0)
                    {
                        visited[w]=1;
                        printf("%c->",G.vertices[w].data);
                        EnQueue(Q,G.vertices[w].data);
                    }
                    s=s->nextarc;
                }
            }
        }
        printf("完成\n");
    }


     //输出邻接表
     void printAdjList(ALGraph G)
     {
      int i;
      ArcNode *p;
      printf("%4s%6s%12s\n","编号","顶点","相邻边编号");
      for(i=0;i<G.vexnum;i++)
      {
          printf("%4d%5c",i,G.vertices[i].data);
          for(p=G.vertices[i].firstarc;p;p=p->nextarc)
          printf("%3d",p->adjvex);//弧所指的顶点的位置
          printf("\n");


      }
     }
     int main(){
     ALGraph G;
     creatUDG(G);//调用无向图创建函数CreateDG()
     printf("无向图的邻接表为;\n");
     printAdjList(G);//打印简历的无向图的邻接表
     printf("广度优先遍历该无向图:\n");
     BFSTraverse(G);//调用图的广度优先函数BFSTraverse()
     }

猜你喜欢

转载自blog.csdn.net/qq_38452951/article/details/80499642