#include <stdlib.h>
#include <stdio.h>
#define MAX_NUM 10 //最多可存储的顶点数
const int NUL = -1;
const int FALSE = -1;
const int TRUE = 0;
int visited[MAX_NUM]; //访问标志组
typedef struct
{
int vexs[MAX_NUM]; //顶点数组
int arcs[MAX_NUM][MAX_NUM]; //邻接矩阵
int vexnum, arcnum; //顶点个数 / 弧线个数
}MGraph;
int CreateUDN(MGraph *_G)
{
int i=0, j=0;
int v1=0, v2=0; //弧线两端的顶点及弧线权重
printf("Please enter _G->vexnum, _G->arcnum \n");
scanf("%d %d", &(_G->vexnum), &(_G->arcnum));
for(i=0; i<_G->vexnum; i++) //赋值顶点数组
scanf("%d", &(_G->vexs[i]));
printf("Init _G->vexs OK \n");
for(i=0; i<_G->vexnum; i++) //初始化邻接矩阵
for(j=0; j<_G->vexnum; j++)
_G->arcs[i][j] = 0;
printf("Init _G->vexnum OK \n");
for(i=0; i<_G->arcnum; i++) //邻接矩阵赋值
{
scanf("%d %d", &v1, &v2);
_G->arcs[v1][v2] = v1 + v2;
_G->arcs[v2][v1] = v1 + v2;
}
printf("Set _G->arcnum OK \n");
}
/* 获取v的第一个邻接顶点 */
int FirstAdjVex(const MGraph *_G, int _v)
{
int i = 0;
for(i=_v+1; i<_G->vexnum; i++)
{
if(_G->arcs[_v][i])
if(visited[i] == FALSE)
return i;
}
return -1;
}
/* 获取v的下一个(费第一个)邻接顶点 */
int NextAdjVex(const MGraph *_G, int _v)
{
int i = 0;
for(i=_v+1; i<_G->vexnum; i++)
{
if(_G->arcs[_v][i])
if(visited[i] == FALSE)
return i;
}
return -1;
}
/* 深度优先遍历G */
void DFS(MGraph *_G, int _v)
{
int w = 0;
visited[_v] = TRUE;
printf("%d ", _G->vexs[_v]);
for(w=FirstAdjVex(_G, _v); w>=0; w=NextAdjVex(_G, _v))
{
if(visited[w] == FALSE)
DFS(_G, w);
}
}
void DFSTraverse(MGraph *_G)
{
int v = 0;
for(v=0; v<_G->vexnum; v++)
visited[v] = FALSE;
for(v=0; v<_G->vexnum; v++)
{
if(visited[v] == FALSE)
DFS(_G, v);
}
}
int main(void)
{
MGraph G;
CreateUDN(&G);
DFSTraverse(&G);
exit(0);
}