回 帖 发 新 帖 刷新版面

主题:严蔚敏数据结构 迷宫程序。编译出错,求帮忙。

是严蔚敏数据结构里面那个迷宫的问题。他编译过了,有一个提示是105 F:\My c\sjjg\1213_migong.c [Warning] passing arg 1 of `next_step_is_wall' from incompatible pointer type 
运行老是出错。求帮忙。出错提示:运行出错,需要关闭。


#include<stdio.h>
#include<stdlib.h>
struct struct_step    /*格子的类,*/
{
    int x;
    int y;
};
struct struct_step_stuck  /*存放走过的路径,是一个栈类*/
{
    struct struct_step step[70];
    int num;
};
/*注意:最开始写的时候,下面struct struct_step_stuck形参都忘了用指针形式的了.所以入栈后也为空等等云云*/
void push_stuck(struct struct_step_stuck *step_stuck,struct struct_step step)  /*将后面的格子入栈,就是加入到路径*/
{
    step_stuck->step[step_stuck->num]=step;
    step_stuck->num++;
}
void pop_stuck(struct struct_step_stuck *step_stuck)/*将栈顶元素出栈*/
{
    step_stuck->num--;
}
int isempty_stuck(struct struct_step_stuck *step_stuck) /*判断栈是否为空*/
{
    if(step_stuck->num==0)
        return 1;
    else 
        return 0;
}
struct struct_step top(struct struct_step_stuck *step_stuck)/*取栈顶元素*/
{
    if(step_stuck->num==0)
    {
        printf("top stuck error\n");
        exit(1);
    }
    return step_stuck->step[step_stuck->num-1];
}


int next_step_is_wall(int **a,struct struct_step cur_step,struct struct_step fx) /*下一步是否为墙*/
{
    struct struct_step next_step;
    int i=0;
    for(i=0;i<7;i++)
        printf("%d\t",a[0][i]);
    if(cur_step.x+fx.x<0||cur_step.x+fx.x>7)     /*是数组左右外围的墙了*/
        return 1;
    if(cur_step.y+fx.y<0||cur_step.y+fx.y>7)    /*是数组上下外围的墙了*/
        return 1;
    next_step.x=cur_step.x+fx.x;/*next_step=cur_step+fx;*/
    next_step.y=cur_step.y+fx.y;

    if(a[next_step.x][next_step.y]==-1 || a[next_step.x][next_step.y]==1) /*下一步是数组里面的墙或走过的路径*/
        return 1;
    else//if(a[next_step.x][next_step.y]==0)  /*是可以走的路*/
        return 0;
}

void print_stuck(struct struct_step_stuck *step_stuck) /*输出栈中所胡的元素*/
{
    int i;
    if(step_stuck->num==0)
    {
        printf("there is no element in the stuck");
        return;
    }
    /*else*/
    for(i=0;i<step_stuck->num;i++)
    {
        printf("%d,%d%c",step_stuck->step[i].x,step_stuck->step[i].y, i==step_stuck->num?'\n':'\t');
        
    }
}
int main()
{
    struct struct_step cur_step,next_step,final_step;  /*curstep为当前人所处的格子,nextstep为
                                           下一步要走的格子*/
    struct struct_step_stuck step_stuck;/*用来记录所走的路径的*/

    /*格子为-1,表示是墙,格子为0表示可以走的路,格子为1表示走过的路径,左上角的0为起点,右下角的(6,0)位位置为终点*/
    int a[8][8]={
                 0, 0, 0, 0,-1, 0, 0, 0,
                 0, 0, 0, 0,-1, 0, 0, 0,
                 0, 0, 0, 0,-1, 0, 0, 0,
                -1,-1,-1, 0,-1, 0, 0, 0,
                 0, 0, 0, 0,-1, 0,-1,-1,
                 0, 0, 0, 0, 0, 0, 0, 0,
                 0, 0, 0, 0,-1, 0,-1, 0,
                 0, 0, 0,-1, 0,-1, 0, 0
                };
    int i;
    struct struct_step fangxiang[4]={ {0,1},{1,0},{0,-1},{-1,0} };/*方向:东,南,西,北.*/
    cur_step.x=0,cur_step.y=0;    /*cur_step={0,0}*/
    final_step.x=7,final_step.y=6;/*final_step={7,6}; */   /*假设是从{0,0}走到{7,6}这个出口*/
    
    step_stuck.num=0;  /*初始化栈*/
    push_stuck(&step_stuck,cur_step);  /*将{0,0}入栈*/
    print_stuck(&step_stuck);
    printf("%d\n",isempty_stuck(&step_stuck));
    while(!isempty_stuck(&step_stuck))
    {
            for(i=0;i<4;i++)
            {
                if(next_step_is_wall(a,cur_step,fangxiang[i])) /*如果这个方向下一格子为墙或是不能走的路的话,则判断下一个方向*/
                    continue;
                /*下一步不为墙,是可以走的路*/
                next_step.x=cur_step.x+fangxiang[i].x;/*next_step=cur_step+fangxiang[i];*/
                next_step.y=cur_step.y+fangxiang[i].y;
                push_stuck(&step_stuck,next_step);      /*将下一格子入栈*/
                cur_step=top(&step_stuck);   /*当前位置设为栈顶元素,就是最后走的那步*/
                
                /*如果栈顶元素为出路的话,则输出路径,任务完成了并结束程序*/
                if(cur_step.x==final_step.x&&cur_step.y==final_step.y)/*cur_step==final_step*/
                {
                    print_stuck(&step_stuck);
                    exit(0);
                }
                break;/*不是出路则判断下一个格子,注意不是下一个方向*/
            }

            if(i==4) /*4个方向里,如果除了前一步的其它三个方向都不能走的话.将当前步标记为墙,并出栈*/
            {
                cur_step=top(&step_stuck);
                a[cur_step.x][cur_step.y]=-1;/*标记为墙*/
                pop_stuck(&step_stuck);
            }

    }
    if(isempty_stuck(&step_stuck))/* 栈为空,则无解*/
    {
        printf("没有可以到达的路径\n");
    }


}

回复列表 (共4个回复)

沙发

等等我再把流程图贴上来。。

板凳

好像把41行的int **a改成int a[8][8]就可以了,不过你的程序貌似结果错误

3 楼


谢谢

4 楼


谢谢猪猪猪猪的回答

我来回复

您尚未登录,请登录后再回复。点此登录或注册