弗洛伊德求任意两点间最短路径

#include<stdio.h>
#define MAXSIZE 122
#define INFINITY 288
typedef struct{
	int adj;
}ArcNode;
typedef struct{
	int vex[MAXSIZE];
	ArcNode arcs[MAXSIZE][MAXSIZE];
	int vn,an;
}AdjMatrix;
typedef struct{
	int element[MAXSIZE];
	int top;
}SeqList;
typedef SeqList VertexSet;
	AdjMatrix M;
	VertexSet Path[MAXSIZE][MAXSIZE];
	int Dist[MAXSIZE][MAXSIZE];
/*这三个变量若定义在主函数内部,会出现segment fault*/ 
InitList(SeqList*S)//初始化顺序表 
{
	S->top=-1;
}
PushList(int e,SeqList*S)//入表 
{
	S->top++;
	S->element[S->top]=e;
}
SeqList JointList(SeqList*A,SeqList*B)//将两表合成一个新表 
{
	SeqList C;
	int t;
	C.top=0;
	for(t=0;t<A->top;t++)
	{
		C.element[C.top]=A->element[t];
		C.top++;
	}
	for(t=0;t<=B->top;t++)
	{
		C.element[C.top]=B->element[t];
		C.top++;
	}
	return C;
}
CreateAdjMatrix(AdjMatrix*M)//创建邻接矩阵 
{
	int i,j;
	scanf("%d",&M->vn);
	for(i=0;i<M->vn;i++)M->vex[i]=i;
	for(i=0;i<M->vn;i++)
	for(j=0;j<M->vn;j++)
	scanf("%d",&M->arcs[i][j].adj);
}
ShortestPath(AdjMatrix*M,VertexSet Path[][MAXSIZE],int Dist[][MAXSIZE])//求任意两点最短路径及长度,Path存路径,Dist存长度 
{
	int i,j,k;
	for(i=0;i<M->vn;i++)
	for(j=0;j<M->vn;j++)
	{
		InitList(&Path[i][j]);
		Dist[i][j]=M->arcs[i][j].adj;
		if(Dist[i][j]<INFINITY)
		{
			PushList(i,&Path[i][j]);
			PushList(j,&Path[i][j]);
		}
	}
	for(k=0;k<M->vn;k++)
	for(i=0;i<M->vn;i++)
	for(j=0;j<M->vn;j++)
	{
		if(Dist[i][k]+Dist[k][j]<Dist[i][j])
		{
			Dist[i][j]=Dist[i][k]+Dist[k][j];
			Path[i][j]=JointList(&Path[i][k],&Path[k][j]);
		}
	}
}
int main()
{

	int p[20];
	int m,n,k=0;
	CreateAdjMatrix(&M);
	ShortestPath(&M,Path,Dist);
	scanf("%d",&m);//输入m行数据,每行两个量,输出两个量之间的最短路径长度 
	for(n=0;n<m;n++)
	{
		scanf("%d %d",&p[k],&p[k+1]);
		k=k+2;	
	}
	k=0;
	for(n=0;n<m;n++)
	{
		printf("%d\n",Dist[p[k]][p[k+1]]);
		k=k+2;
	}
	return 0;
	
}

孩子想知道为何17、18、19行的三个变量定义在主函数内部会报错:segment fault,而定义为全局变量则没事?球球dl们了教教孩子

对了这个代码段是修改之后的,完整的可以正确运行