1. 程式人生 > >6-15 圖的深度遍歷-鄰接表實現

6-15 圖的深度遍歷-鄰接表實現

 圖的深度遍歷-鄰接表實現 (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;
}
/* 你的程式碼將被嵌在這裡 */

對於給定圖:

圖的遍歷樣例.png

輸入樣例:

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;  //返回後遍歷同層次