| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1035 人关注过本帖
标题:出现了段错误,但是不会改,给出调试结果,麻烦各位解决一下~
取消只看楼主 加入收藏
YC_Liu
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-11-23
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:4 
出现了段错误,但是不会改,给出调试结果,麻烦各位解决一下~
调试结果如图
图片附件: 游客没有浏览图片的权限,请 登录注册


应该是显示路径那个函数错误了,但是我感觉没错呀,哪里出现段错误了,麻烦解决,谢谢
附上代码如下:


程序代码:
#include <stdio.h>
#include <stdlib.h>
typedef int status; 
#define OK  1
#define  OVERFLOW -2
#define ERROR 0 
#define FALSE 0
#define TRUE 1
#define INFEASIBLE -1

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{
    int x;      //定义行的数值
    int y;      //定义列的数值
}PosType;

typedef struct        //定义迷宫元素
{
    int ord;          //通道块在路径上的序号
    PosType seat;     //通道块在迷宫中的坐标位置
    int di;           //从此通道块走向下一通道块的方向
}SElemType;

typedef struct           //引入栈链储存路径
{
    SElemType * base;     //栈底指针,在栈构造之前和销毁之后,base的值为NULL
    SElemType * top;      //栈顶指针
    int stacksize;        //当前已分配的储存空间
}SqStack;

status InitStack(SqStack &S)    //初始化栈链
{
    S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S.base) exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

status Push(SqStack &S, SElemType e)   //入栈
{
    if(S.top-S.base>=S.stacksize)
    {
       S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
       if(!S.base)    exit(OVERFLOW);
       S.top=S.base+S.stacksize;
       S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
    return  OK;
}

status Pop(SqStack &S,SElemType &e)   //出栈
{
    if(S.top==S.base)  return ERROR;
    e=*--S.top;
    return OK;
}

status StackEmpty(SqStack S)      //判断栈是否为空
{
    if(S.top==S.base)  return OK;
    else
    return ERROR;
}

void display_maze(int maze[11][11])                   //展示迷宫
{
    int i,j;    
       for(i=0;i<10;i++)
      {
        for(j=0;j<10;j++)
        printf("%d ",maze[i][j]);
        printf("\n");
      }
}

status pass(int maze[11][11],PosType current_point)    //可通过的点
{
    if(maze[current_point.x][current_point.y]==1)
        return OK;
    else
        return ERROR;
}
void foot_print(int maze[11][11],PosType nextpoint)   //打上可以通过的标志
{
    maze[nextpoint.x][nextpoint.y]=0;
}

SElemType push_element(int current_step,PosType current_point,int di)   //将可以通过的点放到堆栈里面
{
    SElemType e;
    e.di=di;
    e.ord=current_step;
    e.seat=current_point;
    return e;
}

PosType next_point(PosType current_point,int di)    //下一个探索点
{
    PosType nextpoint=current_point;
    switch(di)
    {
    case 1:
        nextpoint.y+=1;break;
    case 2:
        nextpoint.x+=1;break;
    case 3:
        nextpoint.y-=1;break;
    case 4:
        nextpoint.x-=1;break;
    }
    return nextpoint;
}

status maze_path(int maze[11][11],SqStack S,PosType start,PosType end)  //迷宫路径
{
    PosType current_point=start,save_currentpoint;
    int current_step=1;
    SElemType e;
    InitStack(S);
    do
    {
        if(pass(maze,current_point))
        {
            foot_print(maze,current_point);
            e=push_element(current_step,current_point,1);
            Push(S,e);
            if(current_point.x==end.x&&current_point.y==end.y)
                return OK;
            else
            {
             save_currentpoint=current_point;
             current_point=next_point(current_point,1);
               current_step++;
            }
        }
        else
        {
            if(!StackEmpty(S))
            {
                Pop(S,e);
            current_point=save_currentpoint;
            while(e.di==4&&!StackEmpty(S))
            {
                foot_print(maze,current_point);
                Pop(S,e);current_step--;
            }
            if(e.di<4)
            {
              e.di++;
              Push(S,e);
              current_point=next_point(e.seat,e.di);
            
            }
            }
            
        }
        
    }while(!StackEmpty(S));
    return OK;
}

void display_path(int maze[11][11],SqStack S)   //展示迷宫路径
{
    SElemType *p=S.base;
     if(S.base==S.top)   
        printf("栈为空.\n");  
    while(p!=S.top)
    {
        maze[p->seat.x][p->seat.y]=2;
        *p++;
    }
    int i,j;
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            if(maze[i][j]==2)
                printf("1 ");
            else
                 printf(" ");
        }
    }
}

int main()
{
    SqStack S;
    int maze[11][11]={ {0,0,0,0,0,0,0,0,0,0},{0,1,1,0,1,1,1,0,1,0},{0,1,1,0,1,1,1,0,1,0},{0,1,1,1,1,0,0,1,1,0},{0,1,0,0,0,1,1,1,1,0},{0,1,1,1,0,1,1,1,1,0},{0,1,0,1,1,1,0,1,1,0},{0,1,0,0,0,1,0,0,1,0},{0,0,1,1,1,1,1,1,1,0},{0,0,0,0,0,0,0,0,0,0} };;;
    printf("迷宫如下\n");
    display_maze(maze);
    PosType start,end;
    start.x=1;start.y=1;
    end.x=8;end.y=8;
    if(maze_path(maze,S,start,end))
    {
      display_path(maze,S);
    }
    else
        printf("\n无通道\n");
    return OK;
}

搜索更多相关主题的帖子: status 
2015-11-24 16:33
YC_Liu
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-11-23
收藏
得分:0 
回复 3楼 诸葛欧阳
请问S一定要初始化才行吗?我的S在main里面有定义的,不过没有初始化
2015-11-24 20:35
YC_Liu
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-11-23
收藏
得分:0 
回复 2楼 令狐少侠56
用编程软件就可以呀,开始的话用VC++或者DEV-C都可以的
2015-11-24 20:36
YC_Liu
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-11-23
收藏
得分:0 
已改正
2015-11-24 22:49
YC_Liu
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-11-23
收藏
得分:0 
感谢版主的提示
2015-11-24 22:50
快速回复:出现了段错误,但是不会改,给出调试结果,麻烦各位解决一下~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020629 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved