广度优先遍历和深度优先遍历

/*=============================邻接矩阵的存储结构=============================*/
#include<stdio.h>

#define  OK                 1
#define  ERROR              -1
#define  TRUE               1
#define  FALSE              0
#define  ADJACENCY          1
#define  UNADJACENCY        0
#define  NETWORK_INFINITY   32767
#define  MAX_VERTEX_NUM     20

int visited[MAX_VERTEX_NUM];
typedef int VRType;
typedef int VertexType;
typedef char InfoType;

typedef enum{ DG,DN,UDG,UDN }GraphKind;
typedef struct ArcCell {
   VRType  adj;
   InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct {
   VertexType  vexs[MAX_VERTEX_NUM];
   AdjMatrix   arcs;
   int         vexnum,arcnum;
   GraphKind   kind;
}AMGraph;

/*============================================================================*/
/*                                                                            */
/*                         顺   序   队  列                                   */
/*                                                                            */
/*============================================================================*/
typedef struct{
    int data;
}elemtype;

#define QUEUE_MAXSIZE 100
typedef struct{
    elemtype elem[QUEUE_MAXSIZE];
    int front ,rear;
    int length;
}QUEUE;

void queue_init(QUEUE *q)
{
   (*q).front=(*q).rear=-1; (*q).length=0;
}

int queue_empty(QUEUE *q)
{
   if((*q).length==0) return 1;
   else               return 0;
}

void queue_push(QUEUE *q,elemtype e)
{
   if((*q).length==QUEUE_MAXSIZE) { printf("QUEUE IS FULL"); return ;}
   (*q).rear=++(*q).rear%QUEUE_MAXSIZE;
   (*q).elem[(*q).rear]=e;
   (*q).length++;
   if((*q).length==1&&(*q).front==-1) (*q).front=0;
}

void queue_pop(QUEUE *q,elemtype *e)
{
   if((*q).length==0) { printf("QUEUE IS EMPTY"); return ;}
   *e=(*q).elem[(*q).front++];
   (*q).front=(*q).front%QUEUE_MAXSIZE;
   (*q).length--;
   if((*q).length==0) (*q).front=(*q).rear=-1;
}

void queue_gettop(QUEUE *q,elemtype *e)
{
   if((*q).length) *e=(*q).elem[(*q).front];
   else  printf("QUEUE IS EMPTY");
}

/*========================邻接矩阵的基本操作的实现============================*/

/*-----------------------1、 CreateGraph(&G,V,VR)-----------------------------*/
int CreateGraph( AMGraph *G )
{
   int choice;
   printf(" 1-Directed Graph          /n");
   printf(" 2-Directed Network        /n");
   printf(" 3-UnDirected Graph        /n");
   printf(" 4-UnDirected Network      /n/n");
   do{ if(choice<1||choice>4)printf(" Choose: ");scanf("%d",&choice);}
   while(choice<1||choice>4);
   G->kind = (GraphKind)(choice);

   switch(G->kind){
     case  DG+1: return CreateDG(G);
     case  DN+1: return CreateDN(G);
     case UDG+1: return CreateUDG(G);
     case UDN+1: return CreateUDN(G);
     default : return ERROR;
   }
}

int CreateDG( AMGraph *G )
{
   int IncInfo,i,j,k;    VertexType v1,v2;
   printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
   printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
   printf(" The Graph's incinfo:"); scanf("%d", &IncInfo);  printf("/n");
   /*顶点编号或者名称*/
   for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
   /*初始化邻接矩阵*/
   for(i=0;i< G->vexnum ;i++)
     for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = UNADJACENCY; (G->arcs)[i][j].info = NULL ; }
   /* 构造邻接矩阵 */
   for(k = 0;k < G -> arcnum;k ++){
     printf("/n The %d Arc ./n",k+1);
     printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
     printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
     i = LocateVex(*G,v1); j = LocateVex(*G,v2);
     (G->arcs)[i][j].adj = ADJACENCY;
     if(IncInfo){
       printf(" Enter %d arc's IncInfo:",k+1);
       scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
     }
     printf("/n");
   }
   return OK;
}

int CreateDN(AMGraph *G )
{
   int IncInfo,i,j,k;    VertexType v1,v2,w;
   printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
   printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
   printf(" The Graph's incinfo:"); scanf("%d", &IncInfo);  printf("/n");

   /*顶点编号或者名称*/
   for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
   /*初始化邻接矩阵*/
   for(i=0;i< G->vexnum ;i++)
     for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = NETWORK_INFINITY; (G->arcs)[i][j].info = NULL ; }
   /* 构造邻接矩阵 */
   for(k = 0;k < G -> arcnum;k ++){
     printf("/n The %d Arc ./n",k+1);
     printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
     printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
     printf(" The arc  weight:");scanf("%d",&w);
     i = LocateVex(*G,v1); j = LocateVex(*G,v2);
     (G->arcs)[i][j].adj = w;
     if(IncInfo){
       printf(" Enter %d arc's IncInfo:",k+1);
       scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
     }
     printf("/n");
   }
   return OK;
}

int CreateUDG( AMGraph *G )
{
   int IncInfo,i,j,k;    VertexType v1,v2;
   printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
   printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
   printf(" The Graph's incinfo:"); scanf("%d", &IncInfo);  printf("/n");
   /*顶点编号或者名称*/
   for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
   /*初始化邻接矩阵*/
   for(i=0;i< G->vexnum ;i++)
     for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = UNADJACENCY; (G->arcs)[i][j].info = NULL ; }
   /* 构造邻接矩阵 */
   for(k = 0;k < G -> arcnum;k ++){
     printf("/n The %d Arc ./n",k+1);
     printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
     printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
     i = LocateVex(*G,v1); j = LocateVex(*G,v2);
     (G->arcs)[i][j].adj = ADJACENCY;
     if(IncInfo){
       printf(" Enter %d arc's IncInfo:",k+1);
       scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
     }
     (G->arcs)[j][i] = (G->arcs)[i][j];
     printf("/n");
   }
   return OK;
}
int CreateUDN( AMGraph *G )
{
   int IncInfo,i,j,k;
   VertexType v1,v2,w;

   printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
   printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
   printf(" The Graph's incinfo:"); scanf("%d", &IncInfo);  printf("/n");

   /*顶点编号或者名称*/
   for(i = 0;i < G -> vexnum ;i ++){
     printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i);
   }
   /*初始化邻接矩阵*/
   for(i=0;i< G->vexnum ;i++)
     for(j=0;j< G->vexnum ;j++){
      (G->arcs)[i][j].adj = NETWORK_INFINITY; (G->arcs)[i][j].info = NULL ;
     }
   /* 构造邻接矩阵 */
   for(k = 0;k < G -> arcnum;k ++){
     printf("/n The %d Arc ./n",k+1);
     printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
     printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
     printf(" The arc  weight:");scanf("%d",&w);
     i = LocateVex(*G,v1); j = LocateVex(*G,v2);
     (G->arcs)[i][j].adj = w;
     if(IncInfo){
       printf(" Enter %d arc's IncInfo:",k+1);
       scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
     }
     (G->arcs)[j][i] = (G->arcs)[i][j];
     printf("/n");
   }
   return OK;
}

/*----------------------------3、 LocateVex(G,u)------------------------------*/
int LocateVex( AMGraph G,VertexType u )
{
   int ivex;
   for(ivex = 0;ivex < G.vexnum ;ivex ++)
     if(u == G.vexs[ivex])
       return ivex;
   return ERROR;
}

/*------------------------6、 FirstAdjVex(G,v)----------------------------*/
/*操作结果: 返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回“空”。*/
int FirstAdjVex(AMGraph G,int ivex)
{
   int jvex;
   for(jvex =0;jvex < G.vexnum;jvex ++)
     if(G.arcs[ivex][jvex].adj == ADJACENCY)  return jvex;
   if(jvex >= G.vexnum)  return ERROR;
}

/*-------------------------7、 NextAdjVex(G,v,w)----------------------------*/
/*操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接顶点,则返回“空”。 */

int NextAdjVex(AMGraph G,int ivex ,int jw)
{
   for(jw +=1 ;jw < G.vexnum;jw ++)
     if(G.arcs[ivex][jw].adj == ADJACENCY) return jw;
   if(jw >= G.vexnum)   return  ERROR;
}
/*--------------------------11、深度优先遍历---------------------------------*/
/* int visited[MAX_VERTEX_NUM] */
void VisitFunc(AMGraph G,int v)
{
  printf("%6d",G.vexs[v]);
}

void DFS( AMGraph G,int v )
{
   int w;
   visited[v] = TRUE; VisitFunc(G,v);
   for(w = FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
     if(!visited[w])  DFS(G,w);
}

void DFSTraverse( AMGraph G,int v )
{
   for(v=0;v<G.vexnum;v++) visited[v] = FALSE;
   for(v=0;v<G.vexnum;v++)
     if(!visited[v]) DFS(G,v);
}


/*-------------------------- 12、广度优先遍历----------------------------------*/
void BFSTraverse(AMGraph G)
{
  int v,u,w; QUEUE Q;elemtype e1,e2,e3;

  for(v=0;v<G.vexnum;v++)  visited[v] = FALSE;
  queue_init(&Q);

  for(v = 0;v<G.vexnum;v++)
    if(!visited[v])
    {
      visited[v]=TRUE; VisitFunc(G,v);
      e1.data = v;
      queue_push(&Q,e1);

      while(!queue_empty(&Q))
      {
        queue_pop(&Q,&e2); u = e2.data;
        for(w = FirstAdjVex(G,u);w >= 0;w=NextAdjVex(G,u,w))
         if(!visited[w])
         {
            visited[w]=TRUE;VisitFunc(G,w);
            e3.data =w;queue_push(&Q,e3);
          }/* if */
      }/* while */
  }/* if */
}

 

/*============================================================================*/

/*============================主函数main()====================================*/
int main( void )
{
   int i,j,ivex;
   AMGraph G;
   CreateGraph( &G );

   printf("The Adjacency Matrix is:/n");
   for(i = 0;i < G.vexnum;i ++){
     for(j = 0;j < G.vexnum;j ++)
       printf("%6d",G.arcs[i][j].adj);
     printf("/n");
   }

   printf("/nDFSTraverse AMGraph:/n");
   DFSTraverse(G,ivex);
   printf("/nBFSTraverse AMGraph:/n");
   BFSTraverse(G);
   getch();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值