一个C语言程序的问题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OVERFLOW -2
#define OK 1

typedef int status;

typedef struct{
int x;
int y;
}postype;

typedef struct{
int ord;
postype seat;
int di;
}selemtype;

typedef struct{
int m[10][10];
postype start,end;
}mazetype;

typedef struct{
selemtype *base;
selemtype *top;
int stacksize;
}sqstack;

mazetype maze={{ {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,1,1,1,0,0,0,0,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}},{1,1},{8,8}};

status initstack(sqstack *s)
{
s->base=(selemtype*)malloc(100 * sizeof(selemtype));
if(!s->base) exit (OVERFLOW);
s->top=s->base;
s->stacksize=100;
return OK;
}

status push (sqstack *s,selemtype e)
{
if(s->top - s->base>=s->stacksize)
{s->base=(selemtype*)realloc(s->base,(s->stacksize+10)*sizeof(selemtype));
if(!s->base) exit(OVERFLOW);
s->top=s->base + s->stacksize;
s->stacksize+=10;
}
*s->top++=e;
return OK;
}

status pop(sqstack *s,selemtype *e)
{if(s->top==s->base) return 0;
*e=*--s->top;
return OK;
}

status stackempty(sqstack s){
if(s.top==s.base) return 1;
return 0;
}

status mazepath()
{sqstack mail,daty;
postype curpos;
selemtype e;
int curstep=1;
postype direc[4]={{0,1},{1,0},{0,-1},{-1,0}};
initstack(&mail);initstack(&daty);
curpos=maze.start;
do{
if(maze.m[curpos.y][curpos.x])
{maze.m[curpos.y][curpos.x]=0;
e.ord=curstep;
e.seat=curpos;
e.di=1;
push(&mail,e);
if(curpos.x==maze.end.x&&curpos.y==maze.end.y)
{
if(stackempty(mail))
printf("No path!");
else
{
while(!stackempty(mail)){
pop(&mail,&e); push(&daty,e);
}
printf("path:start");
while(!stackempty(daty)){
pop(&daty,&e);
printf("->(%d,%d)",e.seat.x,e.seat.y);
}
printf("->end\n");
}
return 1;
}
curstep=curstep+1;
curpos.x=curpos.x+direc[1].x;
curpos.y=curpos.x+direc[1].y;
}
else
{if(!stackempty(mail))
{
pop(&mail,&e);
while(e.di==4&&!stackempty(mail))
pop(&mail,&e);
if(e.di<4){
e.di++;push(&mail,e);
curpos=e.seat;
curpos.x=curpos.x+direc[e.di].x;
curpos.y=curpos.x+direc[e.di].y;

}
}
}
}while(!stackempty(mail));
return 0;
}

main()
{
clrscr();
mazepath();
}

这是个迷宫程序,是按照清华版《数据结构》的迷宫算法写的;
此程序已链接成功,但是运行结果却是“null pointer assignment”
小弟是新手,请各位高手帮帮忙,不胜感激
我检查了好几遍了,对算法已了解了,但是我真的没检查出来,能否告诉我是哪里的逻辑错误码啊?

如下修改后无任何语法或链接问题
main()
{
//clrscr();
mazepath();
}

下面是我的代码:(同一本书,我C++版的,请参考,如果有数据结构方面的问题我们可以一起讨论)
凡是喜欢数学或编程都是我的朋友!
//Migong.h
/////////////////////////
/////////迷宫求解////////
//////作者:baihacker//////
/////时间:11.10.2006/////
/////////////////////////
/*class:
Matrix:矩阵类
offsets:搜索偏移
enum directions:四个方向
struct item:搜索节点
Migong:迷宫类
1.创建一个Migong对象
2.使用用Create方法输入数据
3.使用Solve方法进行求解
4.ShowSolve方法显示解
5.可以重复使用Create方法
6.入口只能在左上角
7.默认出口在右下角
ShowAllPath:穷举所有的路径
备注:
由于算法原因,这里的所有路径应该是指
介于:
a.如果两条路存在某个点不同那么就是不同的路
b.如果在一条路中去掉一个或者一个以上的圈,那么他们是同一条路
之间意义上的路
*/
#include <iostream>
#include <stack>
#include <vector>

using namespace std;

#ifndef MIGONG_H
#define MIGONG_H
///////////////////
///////矩阵类//////
///////////////////
class Matrix{
int* m;
int row, col;
bool iscreate;
public:
Matrix(){m=0;iscreate=false;};
~Matrix() {Release();};
bool Create(int, int);
int& operator () (int, int);
int GetRow(){return row;};
int GetCol(){return col;};
void Release();
void Show(char, char );
};

bool Matrix::Create(int r, int c)
{
if( r<=0 || c<=0) return false;

Release();

row = r;
col = c;
m = new int[row*col];

for (int i=0;i<row*col;i++)
{
*(m+i) = 0;
}
iscreate = true;
return true;
}

int& Matrix::operator ()(int r, int c)
{
return *(m+r*col+c);
}

void Matrix::Release()
{
if (iscreate)
{
row = col = 0;
if (m) delete[] m;
m = 0;
}
iscreate = false;
}

void Matrix::Show(char blk='#', char nblk=' ')
{
int i, j;
for (i=0;i<row;i++)
{
for (j=0;j<col;j++)
{
if (*(m+i*col+j) == 0)
cout<<nblk;
else
cout<<blk;
}
cout<<endl;
}
}
/////////////////////////////
////迷宫相关数据结构的定义///
/////////////////////////////
struct offsets{
int a, b;
};

enum directions{
_S = 0,
_E,
_N,
_W
};

struct item{
int row, col, dir;
};

class Migong{
static offsets move[4];
Matrix maze;
Matrix mark;
int row;
int col;
int desr;
int desc;
stack<item> stk;
bool iscreate;
int pathlength;
bool GetPath();
bool IsInPath(int, int);
public:
Migong(){issolved=false;result=0;pathlength=row=col=0;iscreate=false;};
~Migong(){Release();};
bool Create(int* , int , int , int , int );
void Solve();
void Release();
void OutputMaze();
void ShowSolve(char, char );
public:
bool issolved;
item* result;
};

offsets Migong::move[4]={ {1, 0}, {0, 1},
{-1, 0}, {0, -1}};

////////////////////////////
//迷宫数据应该是不含边框的//
////////////////////////////
bool Migong::Create(int* m, int r, int c, int desrow=-1, int descol=-1)
{
if (r<=0 || c<=0) return false;

Release();

if (desrow==-1 || descol==-1)
{
desr = r;
desc = c;
}
else
{
desr = desrow;
desc = descol;
}

row = r;
col = c;
maze.Create(r+2, c+2);
mark.Create(r+2, c+2);

int i, j;

for (i=0;i<r+2;i++)
{
for (j=0;j<c+2;j++)
{
if (j==0 || j==c+1 || i==0 || i==r+1)
{
mark(i, j) = maze(i, j) = 1;

}else
{
mark(i, j) = 0;
maze(i, j) = m[((i-1)*col+j-1)];
}
}
}
return iscreate = true;
}

bool Migong::GetPath()
{
mark(1,1) = 1;
item temp;
temp.col = 1;
temp.row = 1;
temp.dir = _S;
stk.push(temp);

while (!stk.empty())
{
temp = stk.top();
stk.pop();

int i = temp.row;
int j = temp.col;
int d = temp.dir;

while (d<4)
{//根据当前点的状态确定下一个搜索点
int g = i + move[d].a;
int h = j + move[d].b;

if (g==desr && h==desc)
{
return true;
}
//如果这个点不是障碍点且没有被搜索过那么可以对这个点进行搜索
if (maze(g, h)==0 && mark(g, h)==0)
{
mark(g, h) = 1;
temp.row = g;
temp.col = h;
temp.dir = d+1;
stk.push(temp);
i = g;
j = h;
d = _S;//对一下个点进行搜索
}
else d++;
}
}
return false;
}

void Migong::Solve()
{
issolved = GetPath();
if (issolved)
{
pathlength = stk.size();
result = new item[pathlength];
for (int i=0;i<pathlength;i++)
{
*(result+i) = stk.top();
stk.pop();
// cout<<"("<<(*(result+i)).row<<","<<(*(result+i)).col<<")"<<endl;
}
}
while (!stk.empty())
stk.pop();
}

void Migong::Release()
{
if (iscreate)
{
maze.Release();
mark.Release();
row=col=0;
if (result)
delete [] result;
result = 0;
while (!stk.empty())
stk.pop();
}
iscreate = false;
issolved = false;
pathlength = 0;
}

void Migong::OutputMaze()
{
if (!iscreate) return;
maze.Show();
}

bool Migong::IsInPath(int r, int c)
{
if (!iscreate || !issolved)
return false;

item temp;
for (int i=0;i<pathlength;i++)
{
temp = *(result+i);
if ((temp.row==r) && (temp.col==c))
return true;
}

return false;
}

void Migong::ShowSolve(char blk='#',char s='o')
{
if (!iscreate) return;
if (!issolved)
{
cout<<"无解"<<endl;
}
else
{
int i, j;
for (i=0;i<row+2;i++)
{
for (j=0;j<col+2;j++)
{
if ((i==1 && j==1) || (i==desr && j==desc))
{
cout<<s;
}
else if (maze(i, j) == 1)
{
cout<<blk;
}else
{
if (IsInPath(i, j))
cout<<s;
else
cout<<' ';
}
}
cout<<endl;
}
}
}

//////////////////////
//////穷举所有路径////
//////////////////////
offsets move[4]={ {1, 0}, {0, 1},
{-1, 0}, {0, -1}};

struct node
{
int row,col;
};

vector<node> path;
int count;
bool IsReachable( Matrix& maze, Matrix& mark, node beg, node des)
{
if (beg.row==des.row&&beg.col==des.col)
{//如果达到的话那么显示路径
count++;
cout<<"第"<<count<<"条路径:"<<endl;
for (int i=0;i<path.size();i++)
cout<<"("<<path[i].row<<","<<path[i].col<<")";
cout<<"("<<des.row<<","<<des.col<<")";
cout<<endl;
return false;
}
if (maze(beg.row, beg.col)==1 || mark(beg.row, beg.col)==1)
{
return false;
}

path.push_back(beg);
mark(beg.row, beg.col) = 1;

node nextnode;

for (int i=_S;i<_W+1;i++)
{
nextnode.row = beg.row + move[i].a;
nextnode.col = beg.col + move[i].b;

IsReachable(maze, mark, nextnode, des);
}

path.resize(path.size()-1);
mark(beg.row, beg.col) = 0;

return false;//如果不是穷举的话应该根据for循环的结果重新设置返回值
}

/*
参数maze,mark为迷宫长宽均加二的矩阵
desr,desc为出口点
*/
void FindAllPath( Matrix& maze, Matrix& mark, int desr, int desc)
{
node first, last;
first.row = 1;
first.col = 1;
last.row = desr;
last.col = desc;

IsReachable(maze, mark, first, last);

path.clear();
}

/*
m迷宫矩阵数据
r,c行和列的大小
desr,desc目标位置
*/
void ShowAllPath(int* m, int r, int c, int desr=-1, int desc=-1)
{
Matrix maze, mark;
maze.Create(r+2, c+2);
mark.Create(r+2, c+2);

if (desr==-1 || desc==-1)
{
desr = r;
desc = c;
}

int i, j;

for (i=0;i<r+2;i++)
{
for (j=0;j<c+2;j++)
{
if (j==0 || j==c+1 || i==0 || i==r+1)
{
mark(i, j) = maze(i, j) = 1;

}else{
mark(i, j) = 0;
maze(i, j) = m[((i-1)*c+j-1)];
}
}
}

count = 0;
FindAllPath(maze, mark, desr, desc);

maze.Release();
mark.Release();
}
#endif
//main.cpp
#include <iostream>
#include "Migong.h"
using namespace std;

int mg[]={
0,0,1,0,0,0,1,0,//1
0,0,1,0,0,0,1,0,//2
0,0,0,0,1,1,0,1,//3
0,1,1,1,0,0,1,0,//4
0,0,0,1,0,0,0,0,//5
0,1,0,0,0,0,0,1,//6
0,1,1,1,1,0,0,1,//7
1,1,0,0,0,1,0,1,//8
1,1,0,0,0,0,0,0,//9
};

void main()
{
Migong m;
m.Create(mg, 9, 8);
m.OutputMaze();
m.Solve();
m.ShowSolve();

ShowAllPath(mg,9,8,9,8);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2006-12-04
是指针的问题,建议检查一下所有指针的使用有无错误.
(指针的问题不属于编译问题,是逻辑问题,所以链接成功)
第2个回答  2006-12-04
clrscr();这个函数定义在哪里

C语言程序题目:由键盘输入三个数a,b,c,按从小到大的顺序输出这三个数...
intmain(){ inta,b,c,t;printf(请输入三个数:);scanf(%d%d%d,a,b,c);if(ab){ t=a;a=b;b=t;} if(ac){ t=a;a=c;c=t;} if(bc){ t=b;b=c;c=t;} printf(从小到大的顺序是:%d%d%d\\n,a,b,c);return0;} \/iknow-pic.cdn.bcebos.com\/3c6d55fbb2fb4316d355249d2e...

用C语言解决这一道题: 编写一个程序,首先要求用户输入名字,然后要求...
1、首先在Ubuntu的终端写出要实现的内容步骤,注释步骤可以帮助书写者理清思路。2、接下来我们运用Input方法,提示用户输入信息,input中的参数就是提示文字。3、接下来接收好用户输入的内容后,我们就可以运用用户输入的内容进行逻辑处理。4、下面我们运行程序,你会在界面中看到,终端提示你输入名字,不输入...

一个c语言小问题,编写程序?
按照题目要求编写的C语言程序如下(见图)

C语言程序运行错误
是这样,你的程序有两个问题:1. 逻辑关系错误:如jaybestwang同学所说,while内的逻辑是始终成立的,c不等于'n'就肯定等于'N'嘛,所以改成while(c!='n'&&c!='N') ;2. 程序设计缺陷:如deng576631589同学所说,scanf函数会把缓冲区的回车符也载入,因此第二个scanf函数实际上接收的是你第一...

我做了一个非常简单C语言的运行程序 但是无法运行 老提示主函数有问题...
主函数定义为 int型,但是在主函数结束后没有返回一个整型值,导致编译不通过。myss函数声明时,行末没有添加";"在system("pause");后添加return 0;另外在main函数内连续使用两个以上scanf的时候会导致输入值错误。建议第一个scanf语句写为scanf("%d%*c",&sa);good luck~!

c语言出现了一个问题,导致程序停止正常工作,请关闭程序
1、野指针,你使用的指针指向未知区域 2、scanf函数输入整形、字符……的时候缺少了& 3、缓冲区溢出,也就是说你使用数组时不经意间越界了

C语言问题!!!编写一个程序,找出32位中最大和最小的数,这个代码要怎么写...
define N 32 \/\/数组的大小 int main(){ int a[N]={1,2,3,6,9,8,5,4,6,7,2,0,1,3,5,565,51,3,1,1,3,13,1,13,13,1,3,31,13,13,31,3,0};int i=0;int max=a[0],min=a[0];for(i=0;i<N;i++){ if(maxa[i]) min=a[i];} printf("max=%d, min=%d\\...

c语言问题,写出一个C程序的构成,该怎么回答
一个C程序是由函数构成的。一个C程序至少包含一个函数(main函数),也可以包含一个main函数和若干个其他函数,函数是C程序的基本单位。C的函数相当于其它语言中的子程序,用函数来实现特定功能,可以说C是函数式语言,程序全部 工作都是由函数来完成的,C的这种特点使得容易实现程序的模块化。

一个C语言程序的问题
main(){ \/\/clrscr();mazepath();} 下面是我的代码:(同一本书,我C++版的,请参考,如果有数据结构方面的问题我们可以一起讨论)凡是喜欢数学或编程都是我的朋友!\/\/Migong.h \/\/\/ \/\/\/迷宫求解\/\/\/ \/\/\/作者:baihacker\/\/\/ \/\/\/时间:11.10.2006\/\/\/ \/\/\/ \/*class:Matrix:矩阵类 offsets:搜索...

C语言问题求解答,题目编写一个程序,接受一个整数输入,然后显示所有小于...
思路如下:判断是否素数:用所有小于该数的数去除这个数(从2开始),如果有一个能整除,则不是素数;如果没有一个能整除则是该数是素数。条件(int(m\/n)==m\/n)则整除,否则不整除(n<m)如5,用2,3,4去除5,没有一个可整除则5是素数;用2,3去除4,2可整除4,所以4不是素数。

相似回答
大家正在搜