• ベストアンサー

構造体について

構造体について分からない点があり,教えて頂きたく投稿いたします. 現在,以下のような構造体を作成しています. typedef struct{ int data; struct node *NEXT; }node; また,それを管理するためのリストを以下の構造体にて宣言しました. typedef struct{ node *crnt; node *last; }node_list; また,使用する関数内での宣言は以下の通りです. node_list *non_dscvr_node_list; //未探査ノードを格納する node *crt_dscvr_node; //現在探査中のノードを示す node *start; そして, start->data = 10; start->NEXT = NULL; non_dscvr_node_list->crnt = start; non_dscvr_node_list->last = start; : : crt_dscvr_node = non_dscvr_node_list->crnt; non_dscvr_node_list->crnt = crt_dscvr_node->NEXT; //ここでエラーがでる. エラーの詳細は以下の通りです. warning: assignment from incompatible pointer type 私としては,リストに格納されている先頭ノードをポップして,次のノードを先頭にしたつもりだったのですが,ポインタタイプに互換性がないと怒られてしまいました. 少し調べては見ましたが,nodeの構造体を管理するために別に構造体を定義しているページがあまり見あたりません. 従って,そのようなページがあれば教えて頂きたいと思います. このような方法はあまりよくないのでしょうか. 併せて教えていただけますようお願いいたします.

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

typedef struct node{ // 追記:構造体タグ   int data;   struct node *NEXT; // ※ } node; typedef struct node_list{ // 追記:構造体タグ   node *crnt;   node *last; } node_list; とする事で解決すると思います。 もともとNEXTは、構造体タグ名が存在しないものとしてのポインタとして定義されています。 (※ struct nodeは名前を付けては定義されていない) 従って、void*で定義されていると思います。 実験してみたのですが、   non_dscvr_node_list->crnt = (node*)crt_dscvr_node->NEXT;// キャストで型の整合性を取る とするとポインタ互換性のエラーは取れます。 しかし、この対処では局所対処で意味がないので、 NEXTが指す構造体を定義するために、構造体タグ名を追記しました。

hydrangeas0722
質問者

お礼

ありがとうございます. 無事解決に至りました. 構造体の使い方を間違っていたようです. typedef struct a{  : }b; とすると, struct a = b として使用できるようになるのですね. 構造体タグを定義しないとvoid型として定義されてしまうというのは初めて知りました. まだまだ精進いたします. わざわざテストまでして頂き,ありがとうございました.

その他の回答 (2)

回答No.2

typedef struct node_t {   int data;   struct node_t *NEXT; } node; …とやったらどうなります?

hydrangeas0722
質問者

お礼

ありがとうございます. 無事解決に至りました.

  • crew21
  • ベストアンサー率26% (58/222)
回答No.1

typedef で モロに node てのを定義するのはだいじょぶかな。 コンパイラのヘッダで node てのがもしあるとそういうワーニング出るかもです。 無難に node じゃなくて、mytestnode とかにしてもダメでしょうか。 ※すいません。長くて全部読んでないです。パッと見で思いついたこと書きました。

hydrangeas0722
質問者

お礼

回答ありがとうございました. 無事解決に至りました. 長くて申し訳ありません. これからはもう少しコンパクトに説明できるように致します.