c语言迷宫问题

#include<stdio.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
typedef struct QElemType
{
int x,y;
struct QElemType *parent; //用于寻找上一节点

}
QElemType;

typedef struct QNode
{
QElemType data;
struct QNode *next;
}
QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}
LinkQueue;

void InitQueue(LinkQueue *Q)
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
Q->front=Q->rear=NULL;
}
void EnQueue(LinkQueue *Q,QElemType e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
QElemType DeQueue(LinkQueue *Q)
{
QElemType e;
QueuePtr p;
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return (e);

}
int QueueEmpty(LinkQueue *Q)
{
if(Q->front==Q->rear )
return 1;
else
return 0;
}

QElemType NextPos(QElemType e,int i)
{
switch(i)
{
case 1:e.y=e.y+1;break;
case 2:e.x=e.x+1;break;
case 3:e.y=e.y-1;break;
case 4:e.x=e.x-1;break;
}
return (e);
}
QElemType MazePath(int maze[][10],LinkQueue Q)
{
int i;
QElemType e,p;
InitQueue(&Q);
e.x=1;e.y=1;
e.parent=NULL;
EnQueue(&Q,e);
while(!QueueEmpty(&Q))
{
e=DeQueue(&Q);
if(e.x==8&&e.y==8)
return e;
for(i=1;i<=4;i++)
{
p=NextPos(e,i);
if(maze[p.x][p.y]==1)
{
maze[p.x][p.y]=2;
p.parent=&e;
EnQueue(&Q,p);
}

}

}
printf("zhao bu dao");
}
void main()
{
LinkQueue Q;QElemType e,*p;int i,j;

int maze[10][10]=
{{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}
};
InitQueue(&Q);
for (i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%d,",maze[i][j]);
}
printf("\n");
}
printf("\n");
e=MazePath(maze,Q);
p=&e;
while(p)
{
printf("(%d,%d),",p->x,p->y);
p=p->parent;
}

getch();
}
麻烦帮我看下,就是无法通过出口往回找,不知道那里哪错了,麻烦帮我看下。
是应用队列,相当于求广度优先遍历,找到出口,再往回寻入口,麻烦各位高手帮我看下。 都把全部分数拿出来了啊!!帮帮忙。
怎么没人回答啊???????

第1个回答  推荐于2016-01-25
问题出在MazePath内部的e是一个局部变量,并且随着while循环其内容不断变化。保存一个局部变量的地址是没有意义的,函数返回后就被清除。解决的办法是动态分配QElemType类型的对象,还有要注意一下,这个程序中分配的内存最后都没有被释放,这可是个不好的编程习惯。

改好了,你自己看看有没有错误。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct QElemType
{
int x,y;
struct QElemType *parent;//用于存储节点的前一个节点
} QElemType;

typedef struct QNode//队列节点
{
QElemType *data;
struct QNode *next;
} QNode, *QueuePtr;

typedef struct
{
QueuePtr front;
QueuePtr rear;
} LinkQueue;

void InitQueue(LinkQueue *Q)//创建队列
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
Q->rear->next = NULL;
//Q->front=Q->rear=NULL;
}

void EnQueue(LinkQueue *Q, QElemType *e)//将元素入队
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}

QElemType *DeQueue(LinkQueue *Q)//将元素出对
{
QElemType *e;
QueuePtr p;
p=Q->front->next;
e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
return (e);

}
int QueueEmpty(LinkQueue *Q)//判断队列是否为空
{
if(Q->front==Q->rear )
return 1;
else
return 0;
}

QElemType *NextPos(QElemType *e,int i)//节点的下一个位置
{
QElemType *t = (QElemType *)malloc(sizeof(QElemType));
*t = *e;

switch(i)
{
case 1:t->y=t->y+1;break;
case 2:t->x=t->x+1;break;
case 3:t->y=t->y-1;break;
case 4:t->x=t->x-1;break;
}
return (t);
}
QElemType *MazePath(int maze[][10],LinkQueue *Q)//迷宫函数
{
int i;
QElemType *e, *p;
e = (QElemType *)malloc(sizeof(QElemType));
// InitQueue(&Q);
e->x=1;//入口位置,即为第一个节点
e->y=1;
e->parent=NULL; //第一个节点的前一个节点赋值为空
EnQueue(Q, e);//将第一个节点入队
while(!QueueEmpty(Q))
{
e=DeQueue(Q); //把元素出对,并赋值给e
if(e->x==8&&e->y==8)//出口位置,直接返回最后一个节点
return e;
for(i=1;i<=4;i++)
{//将四个方向能走通的位置的节点入队,并将其的parent指向上一个节点
p=NextPos(e,i);
p->parent=e;
if(maze[p->x][p->y]==1)
{
maze[p->x][p->y]=2;
EnQueue(Q,p);
}
else
{
free(p);
p = NULL;
}
}

}
printf("zhao bu dao");//找不到路径
return NULL;
}
void main()//主函数
{
LinkQueue Q;
QElemType *p, *t;
int maze[10][10]=//其中1为能走通
{{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}
};
InitQueue(&Q);
p=MazePath(maze,&Q);//e即为最后一个节点
while(p)//回溯寻找路径
{
printf("(%d,%d),",p->x,p->y);

t = p->parent;
free(p);
p = t;
}

getchar();
}本回答被提问者采纳
第2个回答  2009-05-22
QElemType MazePath(int maze[][10],LinkQueue Q)
{
int i;
QElemType e,p;
InitQueue(&Q);
e.x=1;e.y=1;
e.parent=NULL;
EnQueue(&Q,e);
while(!QueueEmpty(&Q))
{
e=DeQueue(&Q);