函数接口定义:
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );
其中MGraph是邻接矩阵存储的图,定义如下:
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; /* 顶点数 */
int Ne; /* 边数 */
WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
函数DFS应从第V个顶点出发递归地深度优先遍历图Graph,遍历时用裁判定义的函数Visit访问每个顶点。当访问邻接点时,要求按序号递增的顺序。题目保证V是图中的合法顶点。
裁判测试程序样例:
#include <stdio.h>
typedef enum {false, true} bool;
#define MaxVertexNum 10 /* 最大顶点数设为10 */
#define INFINITY 65535 /* ∞设为双字节无符号整数的最大值65535*/
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
typedef int WeightType; /* 边的权值设为整型 */
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; /* 顶点数 */
int Ne; /* 边数 */
WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
bool Visited[MaxVertexNum]; /* 顶点的访问标记 */
MGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void Visit( Vertex V )
{
printf(" %d", V);
}
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );
int main()
{
MGraph G;
Vertex V;
G = CreateGraph();
scanf("%d", &V);
printf("DFS from %d:", V);
DFS(G, V, Visit);
return 0;
}
第一次尝试
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ){//第三个参数为函数作为参数的传递
int visited[Graph->Nv],i;//定义一个遍历函数,用来判断顶点是否遍历完全
for(i = 0;i < Graph->Nv;i++) visited[i] = -1;
i = 0;
Visited[V] = true;
visited[i] = V;i++;
Visit( V );
while(visited[Graph->Nv-1] == -1){//在遍历完全部顶点之前
int i_ = 0;
while(Graph->G[V][i_] != 1||Visited[i_] == true){
i_++;//找到指向的下一个顶点
if(i_ > Graph->Nv-1){
V = visited[i--];
i_ = 0;
}
}//此时的i_即为下一个顶点1
V = i_;
Visited[V] = true;
visited[i] = V;i++;
Visit( V );
}
}
这种方法说不上是错误的,但是对于此题来说是行不通的
可以注意到该函数的第三个形参类型是函数形参
所以题目具有一个测试点,就是通过改变visit函数的算法,从而影响输出的格式(或许?)
所以给题目应该使用递归调用的方法来完成
第二次尝试
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) )
{
int i;
Visited[V] = true;
Visit(V); //打印出V这个结点
for(i = 0; i < Graph->Nv; i++)
{
if(Graph->G[V][i] == 1 && !Visited[i])
{
DFS(Graph, i, Visit); //递归调用DFS
}
}
}
这次就正确了^ _ ^
对于形参是函数的函数,这实际生活中,每个人对同一种问题的解决所设计的算法肯定是不尽相同的,而这个时候将函数作为形参传进函数,通过改变传入的函数,就可以得到针对同一种问题不同算法所得到的各种答案(个人理解)