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

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