深度优先判断两点之间是否存在路径

#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 20
typedef struct ArcNode{
	int hvex,tvex;
	struct ArcNode*hlink,*tlink;
}ArcNode;
typedef struct VertexNode{
	int data;
	ArcNode*firstin,*firstout;
}VertexNode;
typedef struct{
	VertexNode vertex[MAXNUM];
	int vexnum,arcnum;
}OrthList;
int visit[MAXNUM];
void CreateOrthList(OrthList*L)//创建十字链表 
{
	int k,i,j,n,m;
	ArcNode*q;
	scanf("%d %d",&n,&m);
	L->vexnum=n,L->arcnum=m;
	for(k=0;k<n;k++)
	{
	scanf("%d",&(L->vertex[k].data));
	L->vertex[k].firstin=NULL;
	L->vertex[k].firstout=NULL;
	}
	for(k=0;k<m;k++)
	{
		scanf("%d %d",&i,&j);
		q=(ArcNode*)malloc(sizeof(ArcNode));
		q->hvex=i;
		q->tvex=j;
		q->tlink=L->vertex[i].firstout;
		L->vertex[i].firstout=q;
		q->hlink=L->vertex[j].firstin;
		L->vertex[j].firstin=q;
	}
}

ArcNode*FirstAdjVertex(VertexNode*q)//得到当前顶点首个邻接边 
{
	return q->firstout;
}
ArcNode* NextAdjVertex(ArcNode*w)//得到当前顶点下一个邻接边 
{
	return w->tlink;
}
void DepthFirstSearch(OrthList*L,int vi)//深度优先搜索 
{
	ArcNode*w;
	visit[vi]=1;
	w=FirstAdjVertex(&(L->vertex[vi]));
	while(w)//!!不知为何当递归到v1为4时还能进入while语句 
	{
		if(!visit[w->tvex])DepthFirstSearch(L,w->tvex);
		w=w->tlink;
	}
}
void TraverseGraph(OrthList*L,int v0)//遍历顶点 
{
	for(int i=0;i<L->vexnum;i++) visit[i]=0;
	DepthFirstSearch(L,v0);
}
int main()
{
	OrthList L;
	int v0,v1;
	CreateOrthList(&L);
	scanf("%d %d",&v0,&v1);
	TraverseGraph(&L,v0);
	if(visit[v1])printf("yes");
	else printf("no");
	return 0;
}

我的输入是:

4 4

1 2 3 4

1 2

2 3

3 4

3 1

1 4

 

在第55行左右出现Program received signal SIGSEGV, Segmentation fault 

调试发现visit数组没有问题,是可以正确输出的

但不该进的while语句却进了

555求dl解答~

我解决了!!!

把OrthList L定义为全局变量,也就是放在main函数外

不过这是为啥呢有无好心的dl解释

你把 w 打印出来看是什么值不就知道?

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632