Подтвердить что ты не робот

Как определить структуру typedef, содержащую указатели на себя?

Я пишу LinkedList в C, ниже код представляет собой определение Node.

typedef struct {
    int value;
    struct Node* next;
    struct Node* prev;
} Node;

Я понимаю (или думаю, что я это делаю), что struct Node не то же самое, что typedef struct Node. Конечно, мой код компилируется и работает, как предполагается, однако, я получаю много предупреждений при назначении next и prev (предупреждение: назначение из несовместимого типа указателя). Я предполагаю, что это связано с тем, как я определяю их в структуре Node. Я загрузил полный источник здесь

Итак, если это действительно проблема, как определить next и prev внутри typedef struct Node?

Я беспокоился, что это может быть репостью, но я не мог найти то, что искал. Спасибо.

4b9b3361

Ответ 1

Вам нужно сделать это в следующем порядке:

typedef struct Node Node;

struct Node
{
  int value;
  Node *next;
  Node *prev;
};

Это не делает именно то, что вы просили, но оно решает проблему и как это делается вообще. Я не думаю, что там лучший способ.

Этот вид прямого объявления имеет второе использование при скрытии данных. Если список был реализован в библиотеке, в публичном заголовке может быть только typedef, а также такие функции, как:

Node * list_new(void);
Node * list_append(Node *head, Node *new_tail);
size_t list_length(const Node *head);

Таким образом, пользователи библиотеки не имеют легкого доступа к внутренним элементам вашей библиотеки, то есть к полям структуры Node.

Ответ 2

Другим приемлемым способом и с наименьшим изменением кода OP является следующее:

typedef struct NodeT {
    int value;
    struct NodeT * next;
    struct NodeT * prev;
} Node;

Обратите внимание на введение NodeT и его использование в next и prev до Node.