В этом объявлении typedef
typedef struct
{
int number;
struct player *next;
}player;
объявлено два типа. Первый - это неназванная структура, которой присваивается имя typedef player
.
typedef struct
{
//...
}player;
Второй тип - это неполный тип struct player
, объявленный в определении структуры без имени.
struct player *next;
Типы указателей struct player *
и player *
являются двумя разными типами, которые несовместимы.
Таким образом, для такого оператора, как, например,
currentPlayer->next = newPlayer;
, компилятор выдаст ошибку, поскольку в левой части находится объект типа struct player *
, в то время как в правой части находится объект типа player *
.
Вы должны написать
typedef struct player
{
int number;
struct player *next;
}player;
Обратите внимание, что нет необходимости определять эти указатели в области видимости файла
player *newPlayer;
player *firstPlayer;
player *currentPlayer;
Каждая переменная должна быть объявлена в наименьшей области видимости, где она используется. Таким образом, эти указатели могут быть объявлены внутри функции main.