#include<stdio.h>
#include<stdlib.h>
#pragma warning (disable:4996)//vs调试环境
#define MAX_VERTEX_NUM 20
typedef char VertexType;
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];//顶点向量
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//图的临接矩阵
int vexnum, arcnum;//图的顶点数,边的个数
}MGraph;
int visited[MAX_VERTEX_NUM] = { 0 };
//获得顶点c的序号
int LocateVex(MGraph G, VertexType c)
{
int i;
for (i = 1;i <= G.vexnum;i++)//一个一个顶点的看
{
if (c == G.vexs[i])//如果顶点c= G.vexs[i]
return i;//找到了,返回其序号i
}
return -1;//没找到,返回-1
}
//创建无向图
void CreateGraph(MGraph& G)
{
//初始化环节
int i, j;
VertexType char1, char2;
for (i = 0;i <= MAX_VERTEX_NUM - 1;i++)
{
for (j = 0;j <= MAX_VERTEX_NUM - 1;j++)
{
G.arcs[i][j] = 0;//令图的临接矩阵为0
}
}
//创建环节
printf("请输入图的顶点个数和边的个数\n");
scanf("%d %d", &G.vexnum, &G.arcnum);
getchar();
printf("请依次输入顶点\n");
for (i = 1;i <= G.vexnum;i++)
{
scanf("%c", &G.vexs[i]);//创建顶点向量
}
getchar();
printf("请依次输入各条边(eg.AB回车):\n");
for (i = 1;i <= G.arcnum;i++)
{
scanf("%c%c", &char1, &char2);
getchar();
int j, k;
j = LocateVex(G, char1);//获得顶点char1在图中的序号,赋值给j
k = LocateVex(G, char2);//获得顶点char2在图中的序号,赋值给k
G.arcs[j][k] = 1;//无向图
G.arcs[k][j] = 1;//存储邻接矩阵的二维数组中该元素置1,表示边存在
}
//输出环节
printf("该图的各个顶点为: ");
for (i = 1;i <= G.vexnum;i++)
printf("%c ", G.vexs[i]);
printf("\n该图的邻接矩阵为:\n");
for (i = 1;i <= G.vexnum;i++)
{
for (j = 1;j <= G.vexnum;j++)
{
printf("%d ", G.arcs[i][j]);
}
printf("\n");
}
}
//获得v的第一个邻接结点的序号
int FirstAdjVex(MGraph G, VertexType v)
{
int i, j;
i = LocateVex(G, v);//获得顶点v在图中的序号,赋值给i
for (j = 1;j <= G.vexnum;j++)//一个一个顶点看
{
if (G.arcs[i][j] == 1)//如果i到j有边,则j为v的第一个邻接结点的序号
return j;//返回j
}
return 0;//如果找不到,返回0
}
//获得图中v顶点的w邻接顶点之后的下一个顶点的序号
int NextAdjVex(MGraph G, VertexType v, VertexType w)
{
int a, b, i;
a = LocateVex(G, v);//获得顶点v在图中的序号,赋值给a
b = LocateVex(G, w);//获得顶点w在图中的序号,赋值给b
for (i = b + 1;i <= G.vexnum;i++)
{
if (G.arcs[a][i] == 1)//如果a到i有边,则i为v顶点的w邻接顶点之后的下一个顶点的序号
return i;//找到了,返回i
}
return 0;//没找到,返回0
}
//无向图的从顶点v1的深度遍历
void DFS(MGraph G, VertexType v1)
{
int i, w;
i = LocateVex(G, v1);//获得顶点v1在图中的序号,赋值给a
if (visited[i] == 0)//如果位置为i的顶点没有被访问过
{
printf("%c ", G.vexs[i]);//打印出来
visited[i] = 1;//表示已经被访问过了
}
w = FirstAdjVex(G, v1);//如果访问过,则w为下一个顶点
while (w)//只要w存在
{
if (visited[w] == 0)//如果序号为w的结点没有被访问
{
DFS(G, G.vexs[w]);//递归
}
w = NextAdjVex(G, v1, G.vexs[w]);//获得图中v顶点的w邻接顶点之后的下一个顶点的序号
}
}
int main()
{
MGraph G;
CreateGraph(G);
VertexType v1;
v1 = G.vexs[1];
printf("深度遍历结果为:");
DFS(G, v1);
printf("\n");
return 0;
}