1. 程式人生 > >深度優先搜尋鄰接表儲存結構下的無向圖

深度優先搜尋鄰接表儲存結構下的無向圖

問題描述

        使用鄰接表儲存下圖所示無向圖,使用深度優先搜尋遍歷無向圖上的各節點

    

解題思路

        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);
		}
	}
}

執行結果