/* 在采用邻接表存储的图上进行广度优先遍历/深度优先遍历 分析:我们知道邻接表上的顶点所连接的节点都是它的相邻节点,而对于广度优先遍历来说,类似于层次遍历,就是要把所有的邻接点进行访问, 所以我们需要从第一个节点开始访问它的所有邻接点,还有需要注意的是,当我们把邻接点访问后,需要依次访问邻接点的邻接点,这就需要 用队列将我们访问过得邻接点入队,这和层次遍历一样,也只有这样,我们才能访问所有的节点。当然,在这个过程中,会有重复访问的情况, 所以我们需要用一个数组来记录节点的访问情况,已访问置true 对于深度优先遍历,顾名思义,我们会把每一个节点“榨干”,“顺藤摸瓜”,同样我们需要一个访问标记数组,而对于深度优先遍历, 我们将采用递归的方式来进行。*///创建邻接表图结构 分为边表节点结构 顶点表节点结构 图结构#define MAXSIZE 100#define TYPE int//边表结构 typedef struct EdgeNode {//边表结点 int index;//该边所指向的顶点的位置,在顶点数组里面的位置信息 int weight;//权值 EdgeNode *next;//下一个邻接边}EdgeNode;typedef struct VertexNode {//顶点表节点 int info;//顶点信息 EdgeNode *firstEdge;//指向第一条依附该顶点的边的指针}VertexNode, Adjlist[MAXSIZE];typedef struct { Adjlist adjlist;//顶点数组 int numE, numV;//边数、顶点数}ALGraph;//队列结构(我们采用顺序队列)struct Squeue { TYPE *arr; int front, rear;};#include <stdio.h>#include <stdlib.h>void BFSBegin(ALGraph *G) { void BFS(ALGraph *, int *, int); int *visited = (int *)malloc(sizeof(int)*G->numV);//设置标记数组 for (int i = 0; i < G->numV; i++) { visited[i] = 0; } for (int i = 1; i < G->numV; i++) {//从第一个节点开始 if (!visited[i]) { BFS(G, visited, i); } }}void BFS(ALGraph *G, int *visited, int v) {//开始广度遍历 //声明有关队列的函数 Squeue *createQueue(int); bool isEmpty(Squeue *); bool enQueue(Squeue *, TYPE, int); bool deQueue(Squeue *sq, TYPE *data, int maxSize); Squeue *sq; sq = createQueue(G->numV);//创建队列 printf("%c ", G->adjlist[v].info);//访问传进来的顶点 enQueue(sq, v, G->numV);//入队 visited[v] = 1;//置为已访问 while (!isEmpty(sq)) {//队列不空,取出队首元素,进行访问 TYPE top; deQueue(sq, &top, G->numV); for (EdgeNode *w = G->adjlist[top].firstEdge; w; w = w->next) {//依次将当前节点的边表入队,和层次遍历一致 if (!visited[w->index]) { printf("%c ", G->adjlist[w->index].info); visited[w->index] = 1; enQueue(sq, w->index, G->numV); } } }}void DFSBegin(ALGraph *G) { void DFS(ALGraph *, int *, VertexNode *, int); int *visited = (int *)malloc(sizeof(int)*G->numV);//设置标记数组 for (int i = 0; i < G->numV; i++) { visited[i] = 0; } for (int i = 0; i < G->numV; i++) {//从第一个节点开始“顺藤摸瓜” if (!visited[i]) { DFS(G, visited, &G->adjlist[i], i); } }}void DFS(ALGraph *G, int *visited, VertexNode *v, int index) { printf("%c ", v->info);//打印传入的节点 visited[index] = 1;//置访问为1 for (EdgeNode *w = v->firstEdge; w; w = w->next) { if (w) {//如果有邻接点,传入DFS if (!visited[w->index]) {//未访问 DFS(G, visited, &G->adjlist[w->index], w->index); } } }}int main() { ALGraph *graph = (ALGraph *)malloc(sizeof(ALGraph *)); //声明函数 void createGraph(ALGraph *); void createGraphInFile(ALGraph *); void dispGraph(ALGraph *); //创建图 createGraphInFile(graph); //打印图 dispGraph(graph); //广度优先遍历 //BFSBegin(graph); //深度优先遍历 DFSBegin(graph); return 0;}