プロが教える店舗&オフィスのセキュリティ対策術

リスト構造にしたいのですがどうすればいいでしょうか。

#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つ目をリスト構造を使って作りたいんです。
お願いします。

A 回答 (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にしておくべきかと。
    • good
    • 0
この回答へのお礼

ありがとうございました。
おかげでプログラムを完成させることがでしました!!

お礼日時:2009/11/11 01:25

コンパイラは通りましたか?


取りあえず、
struct toy next;

struct toy *next;
にした方がよいと思われます。

この回答への補足

そこは書き間違えてました...
*入りでお願いします。

補足日時:2009/11/06 09:43
    • good
    • 0

>struct toy


>{
>char name[10];
>int number;
>struct toy next;
>};

コレでは構造体の入れ子では?
というか、コンパイルエラーにならないのでしょうか?
sizeof(struct toy)はいくつになるのでしょうか???

リスト構造を作る場合、自己参照構造体になるかと。
http://www.google.co.jp/search?hl=ja&source=hp&q …

http://www.booran.com/menu/c/algo_list.html
とか。

ちなみに、繋ぎ替えや項目をたぐり易かったりするので、私は双方向リストを好んで使用します。
ポインタ2つ操作する必要があるので、場合によっては面倒ですが。

この回答への補足

*nextです。
すみません

補足日時:2009/11/06 03:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!