Как определить структуру typedef, содержащую указатели на себя? - PullRequest
33 голосов
/ 21 октября 2010

Я пишу 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?

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

Ответы [ 2 ]

64 голосов
/ 21 октября 2010

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

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.

25 голосов
/ 21 октября 2010

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

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

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

...