數(shù)據(jù)結(jié)構(gòu)拓展習(xí)題:鄰接表的深度優(yōu)先非遞歸遍歷
題目:一個連通圖采用鄰接表作為存儲結(jié)構(gòu),設(shè)計一個算法,實現(xiàn)從頂點v出發(fā)的深度優(yōu)先遍歷的非遞歸過程。






bool visited[MAX_VERTEX_NUM];
void DFS(ALGraph G, int v)
{
?????? Sqstack S;
?????? InitStack(S);
?????? visited[v] = true;
?????? Push(S, v);
?????? printf("%d ", G.vertices[v].data);
?????? ArcNode* p;
?????? while (!StackEmpty(S))
?????? {
????????????? p = G.vertices[GetTop(S)].firstarc;//p指向棧頂元素的第一個鄰接點
????????????? while (p)
????????????? {
???????????????????? if (visited[p->adjvex] == false)//如果p指向的結(jié)點沒有被訪問
???????????????????? {
??????????????????????????? visited[p->adjvex] = true;//訪問該結(jié)點
??????????????????????????? printf("%d ", G.vertices[p->adjvex].data);
??????????????????????????? Push(S, p->adjvex);//將該結(jié)點入棧
??????????????????????????? p = G.vertices[p->adjvex].firstarc;//p指向該結(jié)點的第一個鄰接點
???????????????????? }
else//如果p指向的結(jié)點被訪問過,
??????????????????????????? p = p->nextarc; //則訪問該結(jié)點沒有被訪問過的鄰接點
????????????? }
????????????? if (p == NULL)
???????????????????? Pop(S);
?????? }
}
void DFS_Traverse(ALGraph G)
{
?????? for (int v = 0; v < G.vexnum; v++)
????????????? visited[v] = FALSE;
?????? for (int v = 0; v < G.vexnum; v++)
?????? {
????????????? if (!visited[v])
?????? ????????????? DFS(G, v);
?????? }
}