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) {
}