私はCでLinkedListを書いています、以下のコードは私のNodeの定義を表します。
typedef struct {
int value;
struct Node* next;
struct Node* prev;
} Node;
struct Node
がtypedef struct Node
と同じではないことを理解しています(またはそうすると思います)。コードが想定どおりにコンパイルおよび実行されることを認めたが、next
およびprev
(警告:互換性のないポインター型からの割り当て)を割り当てると、多くの警告が表示されます。これは、Node構造でそれらを定義する方法に関係していると推測しています。完全なソースをアップロードしました here
それで、もしそれが本当に問題であれば、どのようにnext
とprev
をtypedef struct Node
の中に定義すべきでしょうか?
これは再投稿かもしれないと心配していましたが、探しているものを見つけることができませんでした。ありがとう。
次の順序で実行する必要があります。
typedef struct Node Node;
struct Node
{
int value;
Node *next;
Node *prev;
};
それはあなたが要求したことを正確にはしませんが、それは問題を解決し、これが一般的に行われる方法です。もっと良い方法はないと思います。
この種の前方宣言には、データ隠蔽における2番目の使用法があります。リストがライブラリに実装されている場合、次のような関数とともに、パブリックヘッダーにtypedef
だけを含めることができます。
Node * list_new(void);
Node * list_append(Node *head, Node *new_tail);
size_t list_length(const Node *head);
この方法では、ライブラリのユーザーはライブラリの内部、つまりNode
構造体のフィールドに簡単にアクセスできません。
OPのコードへの変更を最小限に抑えた別の受け入れ可能な方法は次のとおりです。
typedef struct NodeT {
int value;
struct NodeT * next;
struct NodeT * prev;
} Node;
NodeT
が導入されるまで、next
の導入とprev
とNode
での使用に注意してください。