Some thoughts.
1. Having so many global variables makes it harder for you.
2. A singly linked list makes it harder for you.
3. Spreading bits of linked list code all over the place makes it harder for you.
Code:
typedef struct {
int y,x;
} pos_t;
// each snake segment
typedef struct segment
{
pos_t position;
struct segment *prev;
struct segment *next;
} segment_t;
// a doubly linked list for the whole snake
typedef struct {
struct segment *head;
struct segment *tail;
} snake_t;
Then you create linked list functions
Code:
void add_to_head(snake_t *snake, pos_t pos) {
}
void remove_tail(snake_t *snake) {
}