编译,链接都没错,为什么运行的时候停止工作了?

#include
#define MaxSize 100
using namespace std;
typedef struct
{ int i,j;
int pre;
}Box;
typedef struct
{Box data[MaxSize];
int front,rear;
}QuType;
int mg[10][10];
int M=8,N=8,i,j;
void main()
{
int mg[10][10]={{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,1,1,0,0,1},
{1,0,1,1,1,0,0,1,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}};
bool mgpathl(int xi,int yi,int xe,int ye);
if(!mgpathl(1,1,N,M))
printf("迷宫问题没有解!");

}
bool mgpathl(int xi,int yi,int xe,int ye)
{ void print(QuType qu,int front);
int i,j,find=0,di;
QuType qu;
qu.front=qu.rear=-1;
qu.rear++;
qu.data[qu.rear].i=xi;
qu.data[qu.rear].j=yi;
qu.data[qu.rear].pre=-1;
mg[xi][yi]=-1;
while(qu.front!=qu.rear&&!find)
{qu.front++;
i=qu.data[qu.front].i;
j=qu.data[qu.front].j;
if(i==xe&&j==ye)
{find=1;
print(qu,qu.front);
return true;
}
for(di=0;di<4;di++)
{switch(di)
{
case 0:i=qu.data[qu.front].i-1; j=qu.data[qu.front].j;break;
case 1:i=qu.data[qu.front].i; j=qu.data[qu.front].j+1;break;
case 2:i=qu.data[qu.front].i+1; j=qu.data[qu.front].j;break;
case 3:i=qu.data[qu.front].i; j=qu.data[qu.front].j-1;break;
}
if(mg[i][j]==0)
{qu.rear++;
qu.data[qu.front].i=i;j=qu.data[qu.front].j=j;
qu.data[qu.rear].pre;j=qu.front;
mg[i][j]=-1;
}
}
}
return false;
}
void print(QuType qu,int front)
{
int k=front,j,ns=0;
printf("\n");
do
{
j=k;
k=qu.data[k].pre;
qu.data[j].pre=-1;
}while(k!=0);
printf("迷宫路径如下:\n");
k=0;
while(k<MaxSize)
{
if(qu.data[k].pre=-1)
{ns++;
printf("\t(%d,%d)",qu.data[k].i,qu.data[k].j);
if(ns%5==0) printf("\n");
}
k++;
}
printf("\n");
}

if(mg[i][j]==0)
这一行i的下标是负数

图片说明

一般程序运行时停止工作都是内存错误,例如访问非法内存,数组下标越界,段错误等等。调试时可以先确定出错的大致位置,然后再在错误处设置断点单步调试