一、图的深度优先遍历(点的遍历)
还是要再强调一遍,深度优先遍历的是点,是点,是点。这是一种递归的思想,对于当前的结点,如果有邻边,而且邻边的点没有被遍历则进行深度递归。
二、算法与数据结构
1、十字链表
略,参考上一节
2、深度优先遍历算法
//==========================深度优先遍历 是对点的遍历=======================
bool visited[MAX_VERTEX_NUM];
//递归深度优先遍历
void DFS(OLGraph G, int v){
//当前结点设置已经查找过
visited[v] = true;
printf("%c", G.xlist[v].data);
//printf();
//进入到下一个结点, 如果下一个结点没有被访问过则进行 递归
ArcBox * arc = G.xlist[v].firstout;
while (arc != NULL)
{
//当前V这个结点有邻接点的情况 //进入深度递归
int w = arc->headvex;
if (visited[w] == false)
{
//没有访问过的结点才进行深度遍历
DFS(G, w);
}
//进入吓一跳邻边
arc = arc->tlink;
}
}
void DFSTraverse_L(OLGraph G){
//初始化所有visit点
for (int i = 0; i < G.vexnum; i++)
{
visited[i] = false;
}
for (int i = 0; i < G.vexnum; i++)
{
if(!visited[i])
{
//没有访问过结点的 进图不遍历
DFS(G,i);
}
}
}
三、操作
//用十字链表创建一个有向图P165
int vexnum = 4;
char *vexs = "abcd";
int arcnum = 7;
int maps[4][4] = {
{ 0, 1, 1, 0 },
{ 0, 0, 0, 0 },
{ 1, 0, 0, 1 },
{ 1, 1, 1, 0 },
};
OLGraph G;
CreateDG(G,vexnum,vexs,arcnum,maps);
//PrintfGraphDg(G);
DFSTraverse_L(G);
输出:
acdb请按任意键继续. . .