數據結構無向圖的深度優先遍歷


以以下的圖片為例題,僅給出源碼,不談算法思想。

#include <stdio.h>
#include <cstring>
#include <iostream>
#define MAX_VERTEX_NUM 20+3 //最大頂點數量
//#define true 1
//#define false 0
using namespace std;

typedef char VERTEX_TYPE; //頂點的類型

typedef struct node
{
   int vertex_num;    //頂點的數量
   int edge_num;      //邊的數量
   VERTEX_TYPE vertex[MAX_VERTEX_NUM];//頂點信息
   int matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];  //鄰接矩陣
   bool visited[MAX_VERTEX_NUM];  //用於深度搜索的
}Undigraph;//無向圖

void init_undigraph(Undigraph *G)//初始化圖
{
   G->vertex_num = G->edge_num = 0;
   memset(G->vertex,0,sizeof(G->vertex));
   memset(G->matrix,0,sizeof(G->matrix));
   memset(G->visited,0,sizeof(G->visited));  //應該能夠用來初始化邏輯數組吧
}
void add_vertex(Undigraph *G)//添加頂點
{
   printf("請輸入頂點的數量\n");
   cin>>G->vertex_num;//scanf("%d",&G->vertex_num);

   for(int i=0; i < G->vertex_num; ++i)
      cin>>G->vertex[i];//scanf("%c",&G->vertex[i]);
}
int locate_vertex(Undigraph *G,VERTEX_TYPE who)//尋找某個頂點的位置
{
   for(int index = 0; index < G->vertex_num; ++index)
      if( G->vertex[index] == who )
        return index;    //return 找不到
    return -1;//意味着沒找到
}
void add_edge(Undigraph *G)//添加邊
{
   printf("請輸入邊的數量\n");
   cin>>G->edge_num;//scanf("%d",&G->edge_num);

   for(int i=0; i < G->edge_num; ++i)
   {
      VERTEX_TYPE s1,s2;//邊的兩端的頂點
      cin>>s1>>s2;//scanf("%c %c",&s1,&s2);
      int index_1 = locate_vertex(G,s1);//找到這兩個頂點所在的下標
      int index_2 = locate_vertex(G,s2);//同上
      G->matrix[index_1][index_2] = G->matrix[index_2][index_1] = 1;//矩陣是對稱的
   }
}
void create_undigraph(Undigraph *G)//構造一個無向圖
{
   add_vertex(G);//添加頂點
   add_edge(G);  //添加邊
}
void DFS(Undigraph *G,int i)
{
   cout<<G->vertex[i];//printf("%c ",&G->vertex[i]);
   G->visited[i] = true;

   for(int j=0; j < G->vertex_num; ++j)
      if(G->matrix[i][j] == 1 && !G->visited[j])
        DFS(G,j);
}
void DFS_Traverse(Undigraph *G)
{
   for(int i=0; i < G->vertex_num; ++i)
      if(!G->visited[i])
        DFS(G,i);
}
int main(void)
{
   Undigraph G;
   init_undigraph(&G);//初始化無向圖
   create_undigraph(&G);//構造一個無向圖
   DFS_Traverse(&G);//深度優先遍歷
   return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM