#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们了教教孩子
对了这个代码段是修改之后的,完整的可以正确运行