經典算法8:檢索與周游之廣度和深度優先遍歷圖

cwf8 9年前發布 | 2K 次閱讀 C/C++ 算法

    #include <stdio.h>
typedef int datatype; /假定線性表元素的類型為整型/

#define  maxsize  1024    /*假定線性表的最大長度為1024*/  
# define n 100            /* 圖的頂點最大個數 */  
typedef char VEXTYPE;  /* 頂點的數據類型 */  
typedef float ADJTYPE;  /* 權值類型 */  
typedef struct  
{   
    VEXTYPE vexs[n] ;  /* 頂點信息數組 */  
    ADJTYPE arcs[n][n] ; /* 邊權數組 */  
    int num ;    /* 頂點的實際個數 */  
}GRAPH;  

/***********************1。置空圖**********************/  
void GraphInit(GRAPH  *L)  
{  
 L->num=0;  
}  

/***********************2。求結點數**********************/  
int GraphVexs(GRAPH  *L)  
{  
 return(L->num);  
}  

/***********************3。創建圖**********************/  
void GraphCreate(GRAPH  *L)  
{  
 int i,j;  
 GraphInit(L);  
 printf("請輸入頂點數目:");  
 scanf("%d",&L->num);  
 printf("請輸入各頂點的信息(單個符號):");  
 for(i=0;i<L->num;i++)  
 {  
  fflush(stdin);  
  scanf("%c",&L->vexs[i]);  
 }  
 printf("請輸入邊權矩陣的信息:");  
 for(i=0;i<L->num;i++)  
 {  
  for(j=0;j<L->num;j++)  
  {  
   scanf("%f",&L->arcs[i][j]);  
  }  
 }  
 printf("圖已經創建完畢!");  
}  

/***********************4。圖的輸出**********************/  
void GraphOut(GRAPH  L)  
{  
     int i,j;  
     printf("\n圖的頂點數目為:%d",L.num);  
     printf("\n圖的各頂點的信息為:\n");  
     for(i=0;i<L.num;i++)  
        printf("%c  ",L.vexs[i]);  
     printf("\n圖的邊權矩陣的信息為:\n");  
     for(i=0;i<L.num;i++)  
     {  
          for(j=0;j<L.num;j++)  
          {  
             printf("%6.2f ",L.arcs[i][j]);  
          }  
          printf("\n");  
     }  
     printf("圖已經輸出完畢!");  
}  

/***********************5。圖的深度周游**********************/  
void DFS(GRAPH  g,int qidian,int mark[])  
//從第qidian個點出發深度優先周游圖g中能訪問的各個頂點  
{  
     int v1;  
     mark[qidian]=1;  
     printf("%c   ",g.vexs[qidian]);  
     for(v1=0;v1<g.num;v1++)  
     {  
         if(g.arcs[qidian][v1]!=0&&mark[v1]==0)  
            DFS(g,v1,mark);  
     }  
}  
/***********************6。圖的深度周游**********************/  
void GraphDFS(GRAPH  g)  
//深度優先周游圖g中能訪問的各個頂點  
{  
 int qidian,v,v1,mark[maxsize];  
 printf("\n深度周游:");  
 printf("\n請輸入起點的下標:");  
 scanf("%d",&qidian);  
 for(v=0;v<g.num;v++)  
 {  
  mark[v]=0;  
 }  
 for(v=qidian;v<g.num+qidian;v++)  
 {  
  v1=v%g.num;  
  if(mark[v1]==0)  
   DFS(g,v1,mark);  
 }  
}  
typedef  int DATATYPE;     //隊列元素的數據類型  
typedef  struct  
{    
 DATATYPE data[maxsize]; //隊中元素  
   int front,rear;   //隊頭元素下標、隊尾元素后面位置的下標  
} SEQQUEUE;  
/*****************************************************************************/  
void QueueInit(SEQQUEUE *sq)  
//將順序循環隊列sq置空(初始化)  
{  
   sq->front=0;  
   sq->rear=0;  
}  
/*****************************************************************************/  
int QueueIsEmpty(SEQQUEUE sq)  
//如果順序循環隊列sq為空,成功返回1,否則返回0  
{  
   if (sq.rear==sq.front)   
      return(1);  
   else  
      return(0);  
}   
/*****************************************************************************/  
int QueueFront(SEQQUEUE sq,DATATYPE *e)  
//將順序循環隊列sq的隊頭元素保存到e所指地址,成功返回1,失敗返回0  
{  
 if (QueueIsEmpty(sq))   
    { printf("queue is empty!\n");return 0;}  
    else  
    { *e=sq.data[(sq.front)]; return 1;}  
}  
/*****************************************************************************/  
int QueueIn (SEQQUEUE *sq,DATATYPE x)  
//將元素x入隊列sq的隊尾,成功返回1,失敗返回0  
{   
 if (sq->front==(sq->rear+1)%maxsize)  
 {    
  printf("queue is full!\n");  
  return 0;  
 }  
 else  
 {     
  sq->data[sq->rear]=x;  
  sq->rear=(sq->rear+1)%maxsize;  
  return(1);  
 }  
}  
/*****************************************************************************/  
int QueueOut(SEQQUEUE *sq)  
//將隊列sq隊首元素出隊列,成功返回1,失敗返回0  
{  
    if (QueueIsEmpty(*sq))  
    {    
  printf("queue is empty!\n");  
  return 0;  
 }  
    else  
    {          
  sq->front=(sq->front+1)%maxsize;  
  return  1;  
    }  
}  
/***********************7。圖的廣度周游**********************/  
void BFS(GRAPH g,int v,int mark[])  
//從v出發廣度優先周游圖g中能訪問的各個頂點  
{   
     int v1,v2;  
     SEQQUEUE q;  
     QueueInit(&q);   
     QueueIn(&q,v);  
     mark[v]=1;  
     printf("%c   ",g.vexs[v]);  
     while(QueueIsEmpty(q)==0)    
     {   
          QueueFront(q,&v1);  
          QueueOut(&q);   
          for(v2=0;v2<g.num;v2++)  
          {  
               if(g.arcs[v1][v2]!=0&&mark[v2]==0)  
               {   
                    QueueIn(&q,v2);  
                    mark[v2]=1;  
                    printf("%c   ",g.vexs[v2]);  
               }  
              }  
     }  
}  
/***********************8。圖的廣度周游**********************/  
void GraphBFS(GRAPH  g)  
//深度優先周游圖g中能訪問的各個頂點  
{  
 int qidian,v,v1,mark[maxsize];  
 printf("\n廣度周游:");  
 printf("\n請輸入起點的下標:");  
 scanf("%d",&qidian);  
 for(v=0;v<g.num;v++)  
 {  
  mark[v]=0;  
 }  
 for(v=qidian;v<g.num+qidian;v++)  
 {  
  v1=v%g.num;  
  if(mark[v1]==0)  
   BFS(g,v1,mark);  
 }  
}  

/***********************主函數**********************/  

void main()  
{  
 GRAPH tu;  
 GraphCreate(&tu);  
 GraphOut(tu);  
 GraphDFS(tu);  
 GraphBFS(tu);  
}  </pre> 


 本文由用戶 cwf8 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!