【PTA 6-1】邻接矩阵存储图的深度优先遍历(易错点提醒 & 代码实现)

题目

#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 (*Visit)(Vertex)’的粗略说明:

void (*Visit)(int) 是一个函数指针类型参数,它指向一个函数,该函数的参数是一个整数。

在这个例子中,DFS函数通过这个函数指针参数来指定对顶点进行访问时所要执行的操作。具体来说,这个函数指针作为参数提供了函数VIsit的地址(但没有访问之类的操作!gpt竟然还告诉我会直接调用函数,就不用在DFS内部访问了,哼!

AC代码

void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) )
{
    Visit(V);
	Visited[V] = true;
	for(int i=0; i<MaxVertexNum; i++)
	{
		if(Graph->G[V][i] == 1 && Visited[i] == false)
		{
//			Visited[i] = true; 
			DFS(Graph, i, Visit);
		}
	}
}

易错点

1. 邻接矩阵的构造方式题目没有给出,但从提交尝试中发现,两个相连结点对应邻接矩阵的值为 1,但不相连结点对应的值不是INFINITY(题目给出的无穷)!所以判断是否有连接,if 中需用‘Graph->G[V][i] == 1’而不是‘Graph->G[V][i] != INFINITY’来 判断。

2.需要在for循环之前就更新Visited数组的值!细读题目注释交代会发现,主函数中只实现了将visited全部处理为false的操作,但并没有将初始访问的结点置为true,这就要求我们在函数中一开始就更新visited的值。(哎,函数题往往难就难在找到与主函数的默契点~)

~ 希望对你有帮助 ~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值