一切尽在代码中:
其中:本程序的图结构如下:
代码如下:
/***** 图的深度优先遍历DFS ********/
/******** written by C_Shit_Hu ************/
数据结构图的基本算法///
/****************************************************************************/
/*
深度优先搜索的基本思想:递归。
从图的某个确定的顶点 V 出发,访问该顶点 V,然后再依次从 V 的未被访问过的邻接点出发,
继续深度优先遍历, 知道图中与顶点 V 路径相通的邻接点所有顶点都被访问过为止。
由于图不一定是连通的, 因此一次深度优先遍历不一定可以把图中所有的顶点遍历。
若此时有未被访问过的顶点, 就选择图中那个的一个没有被访问过的顶点作为起点,继续深度优先搜索,
重复上述操作,知道所有的顶点都被访问过。
*/
/****************************************************************************/
// 本代码图的存储方式采用邻接链表的方式
#include
#include
// 邻接链表的单链表中的结点的数据结构体类型
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;inext = 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算法,等学完图的搜索后研究一下更加高效的搜索方法。
*/
/******************************************************/
运行图片: