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

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

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

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