C语言用栈解决迷宫求解问题

谁能帮我看看我这个迷宫代码哪里有问题,运行结果一直出错。(C语言)

#include 
#include 
#include 
#define true 1
#define false 0
#define Maxsize 100

typedef struct
{
    int i;
    int j;
    int di;
}Site;
typedef struct
{
    Site data[Maxsize];
    int top;
}Sqstack;

void createmg(int **maze, int L, int R);
void printfmg(int **maze, int L, int R);
int mgpath();
void InitStack(Sqstack **L);
void DestoryStack(Sqstack **L);
int StackEmpty(Sqstack *L);
int Push(Sqstack **L, Site e);
int Pop(Sqstack **L);
Site GetPop(Sqstack *L, Site e);

int main()
{
    mgpath();
    return 0;
}

int mgpath()
{
    int xi, yi, xe, ye, i, j, di, il, jl, n; 
    int **maze;
    int L, R;
    Site path[Maxsize], e;
    Sqstack *s;
    printf("请输入迷宫的长度和宽度 : ");
    scanf("%d %d",&L, &R);
    do
    {
        maze = (int **)malloc(sizeof(int*)*L);
    }while(maze == NULL);
    for(i=0;ido
        {
            *(maze + i) = (int *)malloc(sizeof(int)*R);
        }while(maze+i == NULL);
    }
    createmg(maze, L, R);
    printfmg(maze, L, R);
    printf("请输入入口坐标 : ");
    scanf("%d %d",&xi, &yi);
    printf("请输入出口坐标 : ");
    scanf("%d %d",&xe, &ye);
    InitStack(&s);
    e.i = xi;
    e.j = yi;
    e.di = -1;
    Push(&s, e);
    GetPop(s, e);
    maze[xi][yi] = 0;
    while(!StackEmpty(s))
    {
        GetPop(s, e);
        i = e.i;
        j = e.j;
        if(e.di<4 && !StackEmpty(s))
        {
            e.di++;
            switch(e.di)
            {
                case 0:il = i-1;jl = j;break;
                case 1:il = i;jl = j+1;break;
                case 2:il = i+1;jl = j;break;
                case 3:il = i;jl = j-1;break;
            }
            if(maze[il][jl] == 1)
            {
                s->data[s->top].di = e.di;
                e.i = il;
                e.j = jl;
                e.di = -1;
                Push(&s, e);
                maze[il][jl] = 0;
            }
        }
        else
        {
            Pop(&s);
            maze[e.i][e.j] = 1;
        }
        if(il == xe && jl == ye)
        {
            n = 0;
            printf("一条迷宫路径如下:\n");
            while(!StackEmpty(s))
            {
                GetPop(s, e);
                path[n] = e;
                n++;
                Pop(&s);
            }
            if(n >= 0)
            {
                printf("(%d,%d)",path[n].i, path[n].j);
                if(n>0)
                    printf("-->");
                if((n+1)%5 == 0)
                    printf("\n");
            }
            return true;
        }
    }
    printf("无解!");
    DestoryStack(&s);
    free(maze);
    return false;
}

void createmg(int **maze, int L, int R)
{
    int i, j, fi, fj;
    for(i=0;ifor(j=0;jif(i==0 || j==0 || i==L-1 || j==R-1)
                maze[i][j]=0;
            else
                maze[i][j]=1;
        }
    }
    srand((unsigned)time(NULL));
    for(i=(L+R)*2;i>0;i--)
    {
        fi = rand()%L;
        fj = rand()%R;
        maze[fi][fj] = 0;
    }
}

void printfmg(int **maze, int L, int R)
{
    int i, j;
    printf("  ");
    for(i=0;iprintf("%-2d",i);
    printf("\n");
    for(i=0;iprintf("%-2d",i);
        for(j=0;jswitch(maze[i][j])
            {
                case 0:
                    printf("* ");
                    break;
                case 1:
                    printf("  ");
                    break;
                case 2:
                    printf("1 ");
                    break;
                case 3:
                    printf("S ");
                    break;
                case 4:
                    printf("E ");
                    break;
            }
        }
        printf("\n");
    }
}

void InitStack(Sqstack **L)
{
    (*L) = (Sqstack *)malloc(sizeof(Sqstack));
    (*L)->top = -1;
}

void DestoryStack(Sqstack **L)
{
    free(*L);
}

int StackEmpty(Sqstack *L)
{
    if(L->top == -1)
        return true;
    else
        return false;
}

int Push(Sqstack **L, Site e)
{
    if((*L)->top == Maxsize-1)
        return false;
    (*L)->top++;
    (*L)->data[(*L)->top] = e;
    return true;
}

int Pop(Sqstack **L)
{
    if((*L)->top == -1)
        return false;
    (*L)->top--;
    return true;
}

Site GetPop(Sqstack *L, Site e)
{
    if(L->top != -1)
    {
        e = L->data[L->top];
        return e;
    }
}

求大家帮帮我这个可怜娃吧,在网上自己找资料,改了20多次,每一次成功的,已经放弃了。

Site GetPop(Sqstack *L, Site e);

改为

Site GetPop(Sqstack *L, Site *e);

还有在函数体中,对于 e 的赋值应该修改为:

*e = L->data[L->top];

Push 函数中,对于栈满的判断不正确

if (L->top == Maxsize)

改成

if (L->top == Maxsize - 1)

在 main 函数中,调用 mgpath() 函数时应该传递迷宫的长度和宽度 L 和 R 作为参数:

mgpath(L, R);