深度優先搜尋鄰接表儲存結構下的無向圖
阿新 • • 發佈:2019-05-12
問題描述
使用鄰接表儲存下圖所示無向圖,使用深度優先搜尋遍歷無向圖上的各節點
解題思路
1、建立一個鄰接表接受無向圖資訊
程式實現
#include <stdlib.h> #include <stdio.h> #define MAXVEX 10 #define TRUE 1 #define FALSE 0 /* Status是函式的型別,其值是函式結果狀態程式碼,如OK等 */ typedef int Status; /* 頂點型別應由使用者定義 */ typedef char VertexType; /* 邊上的權值型別應由使用者定義 */ typedef int EdgeType; /* 鄰接表的資料結構 */ typedef struct EdgeNode { // 鄰接點域,儲存該頂點對應的下標 int adjvex; // 鏈域,指向下一個鄰接點 struct EdgeNode *next; } EdgeNode; // 頂點表結點 typedef struct VertexNode { // 頂點域,儲存頂點資訊 VertexType data; // 邊表頭指標 EdgeNode *firstedge; } VertexNode, AdjList[MAXVEX]; typedef struct { AdjList adjList; // 圖中頂點數 int numNodes; // 圖中邊數 int numEdges; } GraphAdjList, *GraphList; void createMyGraph(GraphList *plus); void DFS(GraphList plus, int i); void DFSTraverse(GraphList plus); int main(void) { int i, j; GraphList plus; createMyGraph(&plus); for (i = 0; i < plus->numNodes; i++) { printf("%c:\t", plus->adjList[i].data); EdgeNode *e; e = plus->adjList[i].firstedge; while (e != NULL) { printf("%c\t", plus->adjList[e->adjvex].data); e = e->next; } free(e); printf("\n"); } printf("\n深度優先搜素:\n"); DFSTraverse(plus); } /** * 建立無向圖 */ void createMyGraph(GraphList *plus) { int i, j, k, w; EdgeNode *e; printf("請輸入頂點數和邊數:\n"); scanf("%d,%d", &i, &j); *plus = (GraphList)malloc(sizeof(GraphAdjList)); getchar(); (*plus)->numNodes = i; (*plus)->numEdges = j; // 讀入頂點數 for (i = 0; i < (*plus)->numNodes; i++) { // 輸入頂點資訊 scanf("%c", &(*plus)->adjList[i].data); // 將邊表置為空表 (*plus)->adjList[i].firstedge=NULL; } // 讀入numEdges條邊,建立鄰接矩陣 for(k = 0; k < (*plus)->numEdges; k++) { printf("輸入邊(vi,vj)上的下標i,下標j:\n"); scanf("%d,%d", &i, &j); // 向記憶體申請空間,生成邊表結點 e = (EdgeNode *)malloc(sizeof(EdgeNode)); // 鄰接序號為j e->adjvex = j; // 將e的指標指向當前頂點上指向的結點 e->next = (*plus)->adjList[i].firstedge; // 將當前頂點的指標指向e (*plus)->adjList[i].firstedge = e; // 因為是無向圖,所以需對稱儲存 // 向記憶體申請空間,生成邊表結點 e=(EdgeNode *)malloc(sizeof(EdgeNode)); // 鄰接序號為i e->adjvex=i; // 將e的指標指向當前頂點上指向的結點 e->next= (*plus)->adjList[j].firstedge; // 將當前頂點的指標指向e (*plus)->adjList[j].firstedge=e; } } // 訪問標誌的陣列 int visited[MAXVEX]; /** * 鄰接表的深度優先搜尋操作 */ void DFS(GraphList plus, int i) { EdgeNode *p; visited[i] = TRUE; printf("%c ",plus->adjList[i].data); p = plus->adjList[i].firstedge; while(p) { if(!visited[p->adjvex]) { // 對為訪問的鄰接頂點遞迴呼叫 DFS(plus, p->adjvex); } p = p->next; } } void DFSTraverse(GraphList plus) { int i; // 初始所有頂點狀態都是未訪問過狀態 for(i = 0; i < plus->numNodes; i++) { visited[i] = FALSE; } for(i = 0; i < plus->numNodes; i++) { // 對未訪問過的頂點呼叫DFS,若是連通圖,只會執行一次 if(!visited[i]) { DFS(plus, i); } } }
執行結果