个人摸索写的代码,不保证严谨和安全性,仅供参考而已。
stack.h
/*
* stack.h
*
* Created on: 2012年8月20日
* Author: h
*/
#ifndef STACK_H_
#define STACK_H_
#define STACK_INIT_SIZE 10
#define STACK_INCREME_SIZE 10
//typedef int ElemType;
typedef struct
{
ElemType *top;
ElemType *base;
int size;
} STACK;
STACK * initStack();
int push(STACK *s, ElemType *e);
int pop(STACK *s, ElemType *e);
int isEmpty(STACK *s);
void destoryStack(STACK *s);
#endif /* STACK_H_ */
stack
/*
* stack.c
*
* Created on: 2012年8月20日
* Author: h
*/
#include "maze.h"
#include "stack.h"
#include <stdio.h>
#include <stdlib.h>
STACK * initStack()
{
STACK *s = (STACK *)malloc(sizeof(STACK));
if (s == NULL)
exit(0);
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if (s->base == NULL)
exit(0);
//s->base = s->top;
s->top=s->base;
s->size = STACK_INIT_SIZE;
return s;
}
void destoryStack(STACK *s)
{
free(s->base);
free(s);
}
int push(STACK *s, ElemType *e)
{
if (s == NULL || e == NULL)
return 0;
if ((s->top - s->base) >= s->size)
{
s->base = (ElemType *)realloc(s->base,
(s->size + STACK_INCREME_SIZE) * sizeof(ElemType));
if (s == NULL)
return 0;
s->top = s->base + s->size;
s->size = s->size + STACK_INCREME_SIZE;
}
*s->top = *e;
s->top++;
//s->top++ = *e
return 1;
}
int pop(STACK *s, ElemType *e)
{
if (s == NULL || e == NULL)
return 0;
if (s->top == s->base)
return 0;
s->top--;
*e = *s->top;
//*e = *--s->top
return 1;
}
int isEmpty(STACK *s)
{
return s->base == s->top ? 1 : 0;
}
maze.h
/*
* maze.h
*
* Created on: 2012年8月21日
* Author: h
*/
#ifndef MAZE_H_
#define MAZE_H_
typedef struct
{
int y, x;
} POS;
typedef struct
{
int di;
int sno;
POS seat;
} ElemType;
int isPass(POS p, int item[][10]);
POS getNext(POS curr, int di);
void printMaze(POS curr, int item[][10]);
#endif /* MAZE_H_ */
maze.c
/*
* maze.c
*
* Created on: 2012年8月21日
* Author: h
*/
#include "maze.h"
#include <stdlib.h>
#include <stdio.h>
int isPass(POS p, int item[][10])
{
return item[p.y][p.x] == 0 ? 1 : 0;
}
POS getNext(POS curr, int di)
{
POS p = curr;
switch (di)
{
case 0:
p.x--;
break;
case 1:
p.y++;
break;
case 2:
p.x++;
break;
case 3:
p.y--;
break;
}
return p;
}
void printMaze(POS curr, int item[][10])
{
int i, j;
system("cls");
printf("\n");
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
if (i == curr.y && j == curr.x)
{
printf("@");
continue;
}
if (item[i][j] != 0)
printf("%d",item[i][j]);
else
printf(" ");
}
printf("\n");
}
}
main.c
/*
* main.c
*
* Created on: 2012年8月20日
* Author: h
*/
#include "maze.h"
#include "stack.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
static int item[10][10] =
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 0, 1, 1, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 0, 0, 1, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 1, 1, 0, 1 },
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } };
static const POS inPos =
{ 1, 1 }, outPOS =
{ 8, 8 };
//求迷宫出口
int main(int argc, char **argv)
{
ElemType e;
POS currPos = inPos;
int step = 1;
STACK *s = initStack();
do
{
if (isPass(currPos, item))
{
e.sno = step;
e.seat = currPos;
e.di = 0;
push(s, &e);
item[currPos.y][currPos.x] = 2;
if (currPos.x == outPOS.x && currPos.y == outPOS.y)
{
printf("ok!\n");
getch();
break;
}
step++;
printMaze(currPos, item);
currPos = getNext(currPos, 0);
getch();
} else
{
pop(s, &e);
if (e.di == 4 && !isEmpty(s))
{
item[currPos.y][currPos.x] = 3;
pop(s, &e);
currPos=e.seat;
}
if (e.di <= 3)
{
e.di++;
push(s, &e);
currPos = getNext(e.seat, e.di);
}
}
} while (!isEmpty(s));
return 1;
}
/*
int main(int argc, char **argv)
{
int num = 1348, temp;
STACK *s = initStack();
while (num)
{
temp = num % 8;
push(s, &temp);
num /= 8;
}
printf("the result is \n");
while (!isEmpty(s))
{
pop(s, &temp);
printf("%d", temp);
}
printf("\n");
destoryStack(s);
return 1;
}*/
4262

被折叠的 条评论
为什么被折叠?



