- ベストアンサー
リスト
リスト構造にしたいのですがどうすればいいでしょうか。 #include <stdio.h> #include <stdlib.h> #include <string.h> struct toy { char name[10]; int number; struct toy next; }; /*プロトタイプ宣言*/ void omocha_toy(struct toy *x); int main( void ) { struct toy *x; if((x =(struct toy *)malloc(sizeof(struct toy))) == NULL) { fprintf(stderr,"エラー\n"); exit(1); } sprintf("x -> name,"Osarusan"); x->score = 12; omocha_toy(x); return 0; } void omocha_toy(struct toy *x) } printf("%s",x->name); printf("%d\n",x->number); } このプログラムで2つ目3つ目をリスト構造を使って作りたいんです。 お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
コードのコピペミスだったようで。 自己参照構造体はできたけど、どうやってリスト構造にするのか解らない…ということでしょうか? 検索すれば出てくると思うんですが…… /*プロトタイプ宣言*/ struct toy *add_toy(struct toy *x, char *name, int num); struct toy *add_toy(struct toy *x, char *name, int num) { struct toy *add = (struct toy *)malloc(sizeof(struct toy)); if(add != NULL) { add->next = NULL; strcpy(add->name, name); add->number = num; x->next = add; } return add; } って感じでしょうか。 コールされると「現在指している」もの(第1引数で渡されたモノ)の次に追加します。 失敗した場合はNULLを返却…です。 いろいろエラー処理省いていますが。(nameのバッファオーバラン考慮していないとか、x->nextが入っていた場合に問答無用で上書きするとか) 3つめ以降に追加する場合は呼び出し元の責任で処理して下さい。 # x->next = add; の前に工夫すれば、最後尾に追加…というのも可能です。 # 何度も呼ぶ場合に無駄が多くなりますが。 ちなみに、リスト構造では先端(終端)の場合、その先を指すポインタはNULLとするのがたいていの場合で取られる手段ですので… x =(struct toy *)malloc(sizeof(struct toy)) でmalloc()に成功したらポインタはNULLにしておくべきかと。
その他の回答 (2)
コンパイラは通りましたか? 取りあえず、 struct toy next; を struct toy *next; にした方がよいと思われます。
補足
そこは書き間違えてました... *入りでお願いします。
- Wr5
- ベストアンサー率53% (2173/4061)
>struct toy >{ >char name[10]; >int number; >struct toy next; >}; コレでは構造体の入れ子では? というか、コンパイルエラーにならないのでしょうか? sizeof(struct toy)はいくつになるのでしょうか??? リスト構造を作る場合、自己参照構造体になるかと。 http://www.google.co.jp/search?hl=ja&source=hp&q=%E8%87%AA%E5%B7%B1%E5%8F%82%E7%85%A7%E6%A7%8B%E9%80%A0%E4%BD%93&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=&aq=f&oq= http://www.booran.com/menu/c/algo_list.html とか。 ちなみに、繋ぎ替えや項目をたぐり易かったりするので、私は双方向リストを好んで使用します。 ポインタ2つ操作する必要があるので、場合によっては面倒ですが。
補足
*nextです。 すみません
お礼
ありがとうございました。 おかげでプログラムを完成させることがでしました!!