数据结构无向图的深度优先遍历

以以下的图片为例题,仅给出源码,不谈算法思想。

#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;
}

posted @ 2015-01-27 16:46  zfyouxi  阅读(4842)  评论(0编辑  收藏  举报