3Orange 2021-10-14 20:24 采纳率: 50%
浏览 19
已结题

结构数组与结构对象之间的赋值,用栈组织数组 求各位解答

是课本上的一道例题

#include<iostream>
#define M 4
#define N 4
using namespace std;

int mg[M + 2][N + 2] = {
    {1,1,1,1,1,1},{1,0,0,0,1,1},{1,0,1,0,0,1},{1,0,0,0,1,1},{1,1,0,0,0,1}, {1,1,1,1,1,1}
};

typedef struct
{
    int i; int j; int di;
}Box;
typedef struct
{
    Box data[16];
    int top;
}StType;

void InitStack(StType*& s)
{
    s = (StType*)malloc(sizeof(StType));
    s->top == -1;
}

bool StackEmpty(StType* s)
{
    return(s->top == -1);
}

bool Push(StType*& s, Box e)
{
    if (s->top == 15)return false;
    s->top++;
    s->data[s->top].i= e.i; //结构体数组的赋值
    s->data[s->top].j = e.j;
    return true;
}

bool Pop(StType*& s, Box e)
{
    if (s->top == -1)return false;
    e = s->data[s->top]; s->top--; return true;
}

bool GetTop(StType*& s, Box e)
{
    if (s->top == -1)return false;
    e = s->data[s->top]; return true;
}

void DestroyStack(StType* &s)
{
    free(s);
}

bool mgpath(int xi,int yi,int xe,int ye)//始末位置
{
    Box path[16], e;

    int i, j, li, lj, di, k;

    mg[xi][yi] = -1;

    StType* t;
    InitStack(t);

    e.i = xi; e.j = yi; e.di = -1;

    Push(t, e);

    while (!StackEmpty(t))
    {
        GetTop(t, e);
        i = e.i; j = e.j; di = e.di;
        if (i == xe && j == ye)
        {
            cout << "一条迷宫路径如下:";
            k = 0;
            while (!StackEmpty(t))
            {
                Pop(t, e);
                path[k++] = e;
            }
            for (k; k >= 1; k--)
            {
                cout << "(" << path[k].i << "," << path[k].j << ") ";
                if ((k + 1) % 5 == 0)cout << endl;
            }
            DestroyStack(t);
            return true;
        }
        bool find;//判断是否找到路线
        find = false;

        while (di < 4&&find!=true)
        {
            di++;
            switch (di)
            {
            case 0:li = i - 1; lj = j; break;
            case 1:li = i; lj = j + 1; break;
            case 2:li = i + 1; lj = j; break;
            case 3:li = i; lj = j - 1; break;
            }
            if (mg[li][lj] == 0)find = true;
        }
        if (find)
        {
            t->data[t->top].di = di;//修改原栈顶元素的di值?
            e.i = li; e.j = lj; e.di = -1;
            Push(t, e);//入栈
            mg[li][lj] = -1;
        }
        else
        {
            Pop(t, e);
            mg[e.i][e.j] = 0;
        }
    }
    DestroyStack(t);
    return false;
}


int main()
{
    if (!mgpath(1, 1, M, N))cout << "迷宫无解";
}

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/633411412436198.png "=600 #left")


为什么一直报错?内存哪里出现问题了?

  • 写回答

6条回答 默认 最新

  • 关注

    你的init函数里面top的赋值写成判断了,导致top实际上没有被赋值,所以后续依据top的push会段错误
    有帮助望采纳~

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 2月13日
  • 已采纳回答 2月5日
  • 创建了问题 10月14日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效