6-15 圖的深度遍歷-鄰接表實現
阿新 • • 發佈:2019-01-12
圖的深度遍歷-鄰接表實現 (10 分)
本題要求實現鄰接表儲存圖的深度優先遍歷。
函式介面定義:
void DFS(ALGraph *G,int i);
其中ALGraph是鄰接表儲存的圖,定義如下:
#define MAX_VERTEX_NUM 10 /*定義最大頂點數*/ typedef int Vertex; typedef struct ArcNode{ /*表結點*/ int adjvex; /*鄰接點域*/ struct ArcNode *nextarc; /*指向下一個表結點*/ }ArcNode; typedef struct VNode{ /*頭結點*/ Vertex data; /*頂點域*/ ArcNode *firstarc; /*指向第一個表結點*/ }VNode,AdjList[MAX_VERTEX_NUM]; /*AdjList是陣列型別*/ typedef struct { AdjList vertices; /*鄰接表中陣列定義*/ int vexnum,arcnum; /*圖中當前頂點數和邊數*/ } ALGraph; /*圖型別*/
裁判測試程式樣例:
#include"stdio.h" #include"stdlib.h" #define MAX_VERTEX_NUM 10 /*定義最大頂點數*/ typedef int Vertex; typedef struct ArcNode{ /*表結點*/ int adjvex; /*鄰接點域*/ struct ArcNode *nextarc; /*指向下一個表結點*/ }ArcNode; typedef struct VNode{ /*頭結點*/ Vertex data; /*頂點域*/ ArcNode *firstarc; /*指向第一個表結點*/ }VNode,AdjList[MAX_VERTEX_NUM]; /*AdjList是陣列型別*/ typedef struct { AdjList vertices; /*鄰接表中陣列定義*/ int vexnum,arcnum; /*圖中當前頂點數和邊數*/ } ALGraph; /*圖型別*/ typedef enum{FALSE,TRUE} Boolean; Boolean visited[MAX_VERTEX_NUM];/*定義標誌向量,為全域性變數*/ void CreatALGraph(ALGraph *G);/* 建立圖並且將Visited初始化為false;裁判實現,細節不表 */ void DFS(ALGraph *G,int v); int main() { Vertex v; ALGraph G; CreatALGraph(&G); scanf("%d", &v); printf("DFS from %d:",v); DFS(&G,v); return 0; } /* 你的程式碼將被嵌在這裡 */
對於給定圖:
輸入樣例:
5
輸出樣例:
DFS from 5: 5 1 3 0 2 4 6
void DFS(ALGraph *G, int i) {
printf(" %d", G->vertices[i].data);
visited[i] = TRUE; // 訪問該節點並標記為已讀
for (ArcNode *it = G->vertices[i].firstarc; it != NULL; it = it->nextarc) //遍歷當前結點的鄰接節點
if (visited[it->adjvex] == FALSE)//如果未讀則進行訪問
DFS(G, it->adjvex); // 向深層遍歷
return; //返回後遍歷同層次
}