一切尽在代码中:
其中:本程序的图结构如下:
代码如下:
/***** 图的深度优先遍历DFS ********/ /******** written by C_Shit_Hu ************/ ////////////////数据结构图的基本算法/////////////// /****************************************************************************/ /* 深度优先搜索的基本思想:递归。 从图的某个确定的顶点 V 出发,访问该顶点 V,然后再依次从 V 的未被访问过的邻接点出发, 继续深度优先遍历, 知道图中与顶点 V 路径相通的邻接点所有顶点都被访问过为止。 由于图不一定是连通的, 因此一次深度优先遍历不一定可以把图中所有的顶点遍历。 若此时有未被访问过的顶点, 就选择图中那个的一个没有被访问过的顶点作为起点,继续深度优先搜索, 重复上述操作,知道所有的顶点都被访问过。 */ /****************************************************************************/ // 本代码图的存储方式采用邻接链表的方式 #include <stdio.h> #include <stdlib.h> // 邻接链表的单链表中的结点的数据结构体类型 typedef struct ArcNode{ int adjvex; // 该边指向的顶点在顺序表中的位置 struct ArcNode *next; // 下一条边 }ArcNode; // 邻接表中的顶点数据结构体类型 typedef struct VNode{ int data; // 顶点中的数据信息 ArcNode *firstarc; // 指向单链表,即指向第一条边 }VNode; // 定义访问状态表,并初始化为0 int visited[5]={0,0,0,0,0}; // 创建图结构的函数 void CreatGraph(int n , VNode G[] ){ int i,e; ArcNode *p , *q; printf("Input the information of the vertex\n"); for(i=0;i<n;i++){ scanf("%d",&G[i]); // 输入图的顶点元素信息并存储在一维数组中 G[i].firstarc = NULL; // 初始化第一条边为空 } for(i=0;i<n;i++){ printf("Creat the edges for the %dth vertex\n",i) ; // 依次创建图的顶点的邻接边顶点信息 scanf("%d",&e); // 输入边信息 while(e!=-1){ // 以-1作为输入结束 p = (ArcNode *)malloc(sizeof(ArcNode)); // 创建一条边 p->next = NULL; p->adjvex = e; if(G[i].firstarc == NULL) G[i].firstarc = p; // 若i结点的第一条边为空,则将输入的值所附的顶点作为第一条边上在图中的位置 else q->next = p; // 否则就是下一条边 q = p; scanf("%d",&e); // 输入边信息 } } } // 邻接点查找函数 int FirstAdj(VNode G[],int v){ if(G[v].firstarc != NULL) return (G[v].firstarc)->adjvex; // 如果第一个邻接点不为空, 返回该节点信息 return -1; } int NextAdj(VNode G[],int v){ ArcNode *p; p = G[v].firstarc; while( p!= NULL){ if(visited[p->adjvex]) p = p->next; else return p->adjvex; } return -1; } void DFS(VNode G[],int v){ int w; printf("%d ",G[v]); // 访问当前顶点,打印出该顶点中的数据信息 visited[v] = 1; // 将顶点v对应的访问标记置1 w = FirstAdj(G,v); // 找到顶点v的第一个邻接点,如果无邻接点,返回-1 while(w != -1){ if(visited[w] == 0) // 该顶点未被访问 DFS(G,w); // 递归地进行深度优先搜索 w = NextAdj(G,v); // 找到顶点v的下一个邻接点,如果无邻接点,返回-1 } } int main() { VNode G[5]; // 创建一个 VNODE 结构体类型的数组 CreatGraph(5,G); // 创建图 printf("开始深度优先搜索图.....\n"); printf("搜索结果如下:\n"); DFS(G,0); // 深度优先搜索图 printf("\n"); getchar(); return 0 ; } /******************************************************/ /******************** 心得体会 **********************/ /* 这个算是最基本的DFS算法,等学完图的搜索后研究一下更加高效的搜索方法。 */ /******************************************************/
运行图片: