以下面的图片为例题,仅给出源代码,不谈算法思想。
#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; }
时间: 2024-11-25 10:26:54