贪吃蛇模拟,链表的运用,用C硬写的。。感觉JAVA的LinkedList应该会简单很多,算复习了一次链表吧,写的时候需要很小心。。中间我忘了赋给一个节点的prev节点,结果就一直指针异常。。查了半天,坑啊。。最后内存还要手动释放
#include<stdio.h>
#include<stdlib.h>
struct NodeStruct
{
int i, j;
struct NodeStruct *prev, *next;
};
typedef struct NodeStruct *Node;
struct WormStruct
{
Node head, tail;
};
typedef struct WormStruct *Worm;
static Worm init()
{
Worm worm = malloc(sizeof(struct WormStruct));
Node head = malloc(sizeof(struct NodeStruct));
head->i = 25;
head->j = 30;
head->prev = NULL;
Node prev = head;
int j;
for (j = 29; j >= 11; j--)
{
Node curr = malloc(sizeof(struct NodeStruct));
curr->i = 25;
curr->j = j;
curr->prev = prev;
prev->next = curr;
prev = curr;
}
prev->next = NULL;
worm->head = head;
worm->tail = prev;
return worm;
}
static void move(Worm worm, char c)
{
int i = worm->head->i, j = worm->head->j;
if (c == 'E')
j++;
else if (c == 'W')
j--;
else if (c == 'N')
i--;
else
i++;
Node head = malloc(sizeof(struct NodeStruct));
head->i = i;
head->j = j;
head->prev = NULL;
head->next = worm->head;
worm->head->prev = head;
worm->head = head;
Node tail = worm->tail;
worm->tail = tail->prev;
worm->tail->next = NULL;
free(tail);
}
static int off_self(Worm worm)
{
Node curr, head = worm->head;
int i = head->i;
int j = head->j;
for (curr = head->next; curr != NULL; curr = curr->next)
if (i == curr->i && j == curr->j)
return 1;
return 0;
}
static int off_board(Worm worm)
{
int i = worm->head->i;
int j = worm->head->j;
return i < 1 || j < 1 || i > 50 || j > 50;
}
int main()
{
int i, n;
char s[100];
while (scanf("%d", &n), n)
{
getchar();
gets(s);
Worm worm = init();
for (i = 0; i < n; i++)
{
move(worm, s[i]);
if (off_self(worm))
{
printf("The worm ran into itself on move %d.\n", i + 1);
break;
}
if (off_board(worm))
{
printf("The worm ran off the board on move %d.\n", i + 1);
break;
}
}
if (i == n)
printf("The worm successfully made all %d moves.\n", n);
Node temp, curr = worm->head;
while (curr != NULL)
{
temp = curr;
curr = curr->next;
free(temp);
}
free(worm);
}
return 0;
}