• ベストアンサー

リスト

リスト構造にしたいのですがどうすればいいでしょうか。 #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つ目をリスト構造を使って作りたいんです。 お願いします。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.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にしておくべきかと。

tonyemly
質問者

お礼

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

その他の回答 (2)

noname#130082
noname#130082
回答No.2

コンパイラは通りましたか? 取りあえず、 struct toy next; を struct toy *next; にした方がよいと思われます。

tonyemly
質問者

補足

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

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>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つ操作する必要があるので、場合によっては面倒ですが。

tonyemly
質問者

補足

*nextです。 すみません

関連するQ&A

  • 単方向リスト

    #include<stdio.h> #include<stdlib.h> #include<string.h> struct Address{ char name[100]; char tel[100]; char email[100]; }; struct AddressList { struct Address addr; //データそのもの struct AddressList *next; //後続ノードへのポインタ struct AddressList *prev; }; struct AddressList *this,*last,*new,*first; struct Address *addr; /*--------ここからmain関数------------*/ int main(void){ int n,i; //何番目に入れるか? char quit[100]; //繰り返しを止める時に利用。 first=last=NULL; //まず初期化 addr =(struct Address *)malloc(sizeof(struct Address)); if(addr==NULL){ fprintf(stderr,"malloc:error\n"); exit(1); } while(-1){ printf("整数を入力してください。\n"); scanf("%d",&n); printf("名前を入力してください。\n"); scanf("%s",addr->name); printf("電話番号を入力してください。\n"); scanf("%s",addr->tel); printf("メールアドレスを入力してください。\n"); scanf("%s",addr->email); new =(struct AddressList *)malloc(sizeof(struct AddressList)); //新たに加えるリストの動的メモリー確保 if(new==NULL){ fprintf(stderr,"malloc:error\n"); exit(1); } new->addr=addr; //ここでエラーが発生します。 new->next=NULL; incompatible types in assignment とエラーがでます。 型はあってると思うんですが、、、 よろしくおねがいします。

  • リストの削除について(構造体)

    リストの削除のプログラムを実行して行ってみると、リストの削除処理中にプログラムが終わって変更後処理がうまく表示されません。どこが間違っているかが分からないしだいです。返答のほどよろしくお願いいたします。 #include<stdio.h> #include<malloc.h> #include<string.h> struct list{ char name[20]; int age; struct list *next; }; void main(void) { struct list *head, *p, *n, *old; char key[20]; /*ダミーノード作成*/ head = (struct list*)malloc(sizeof(struct list)); old = head; while(p = (struct list*)malloc(sizeof(struct list)), printf("name age入力\n"), scanf("%s %d", p -> name, &p -> age) != EOF){ old -> next = p; old = p; } free(p); old -> next = NULL; p = head -> next; printf("変更前リスト\n"); while(p != NULL){ printf("name:%s age:%d\n",p -> name, p -> age); p = p -> next; } printf("削除key入力(name)\n"); gets(key); n = head; while(n != NULL){ old = n; n = n -> next; //printf("n -> name %s\n", n -> name); if(strcmp(n -> name, key) == 0){ printf("%s削除\n", key); //printf("n -> name %s old -> name %s\n", n -> name, old -> name); old -> next = n -> next; } } p = head -> next; printf("変更後リスト\n"); while(p != NULL){ printf("name:%s age:%d\n", p -> name, p -> age); p = p -> next; } }

  • リスト構造がうまく動きません!!

    C言語で以下のようなプログラムを作りました。 「main関数内で下記のデ-タを構造体に格納し、キーボードから入力された名前と該当する学生の身長と年齢を画面に表示するプログラムを作成せよ。」というものです。 このプログラムはコンパイルは通るのですが、2人目以降のデータを表示させようとしても表示してくれません。。。どうもリスト構造のfor文がうまくループしていないみたいなんですが原因が分かりません。どなたか原因の分かる方アドバイスをお願いしますm(_ _)m #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct data{ char name[20]; int height; int age; struct data *next; }person; person *newperson(void); int main(void){ char namae[20],s[20]; int toshi,shinchou,i; person *head; person *list; person *nlist; person *LIST; head = newperson(); nlist = head; printf("データを入れてください。\n"); for(i=0;i<=4;i++){ scanf("%s",namae); scanf("%d",&shinchou); scanf("%d",&toshi); list = newperson(); strcpy(list ->name,namae); list -> height = shinchou; list -> age = toshi; nlist -> next = list; nlist = list; } printf("知りたい人の名前は?\n"); scanf("%s",s); for(LIST = head->next;LIST ->next != NULL;LIST = LIST->next){ if(strcoll(s,LIST ->name)==0){ printf("%s\t%d\t%d\n",LIST->name,LIST->height,LIST->age); break; } printf("%s\n",LIST->name); printf("%s\n",LIST->next->name); } return(0); } person *newperson(){ person *dummy; dummy = (person*)malloc(sizeof(person)); dummy -> next = NULL; return(dummy); }

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • リスト構造を双方向リスト構造に書き換えたいです

    C言語初心者です。以下のリスト構造を双方向リストに書き換えたいです。 構造体にstruct transcript *prvs;を追加するのはいいとして、その後どのように変更したらよいでしょうか。関数printingdudeのprvs版を追加し、メイン部でprintingdude_prvs(Z)をすればよいでしょうか。詳しい方、お手数ですがご教示頂きたいです。。 #include <stdio.h> #include <stdlib.h> typedef struct transcript { int no; struct transcript *next; } tra; void printingdude(tra *x) { if (x == NULL) return; printf("%d",x->no); if (x->next != NULL) { printf(", "); printingdude(x->next); } else { printf("\n"); } return; } void free_noud(tra *x) { while (x != NULL) { tra *t = x->next; free(x); x = t; } return; } tra* nnoud(int v, tra* c) { tra *x = (tra *) malloc(sizeof(tra)); if (!x) { printf("\ncan't allocate memory for a new node"); exit(EXIT_FAILURE); } x->no = v; x->next = c; return x; } int main() { tra *Z = NULL; for (int n = 10; n>0; n--) { printingdude(Z); Z = nnoud(n, Z); } printingdude(Z); free_noud(Z); return 0; }

  • アルゴリズム 線形リスト

    最近リストについて習い始めました。入力したデータと同順に並ぶリストを作成しようと思い、コードを打ったのですが…動作中止の表示がでてしまいました。どこが間違っているのか、ずっと悪戦苦闘して組んでいるのですが、全く出口が見えてきません。何が間違えているのか、はたまた根本的に違うのか、ご指導して頂けると有難いです。 以下、コードです。 #include <stdio.h> #include <stdlib.h> #include <string.h> struct hito{ char name[20]; int age; struct hito *next; }; void main(void){ struct hito *p, *head, *dummy; char new_name[20]; int new_age; dummy = (struct hito *)malloc(sizeof(struct hito)); head = dummy; dummy->next = p; dummy = p; while (scanf("%s %d" , new_name, &new_age) != EOF) { p = (struct hito *)malloc(sizeof(struct hito)); strcpy(p->name, new_name); p->age = new_age; p->next = head; head = p; } while(p != NULL) { printf("\t%-20s %3d\n" , p->name, p->age); p = p->next; } }

  • ポインタと動的確保について

    #include <stdio.h> #include <stdlib.h> typedef struct LIST{ int number; char name[30]; }list; void test(list** ls) { list *tmp; tmp=*ls; //tmpに*lsのアドレスを参照させる printf("%d\n",(*ls)->number); //5と表示 printf("%d\n",tmp->number); //5と表示 (*ls)->number=10; //lsの指すものを10に変更 printf("%d\n",(*ls)->number); //10と表示 printf("%d\n",tmp->number); //10と表示 *ls=(list *)calloc(1,sizeof(list)); //lsを動的確保 printf("%d\n",(*ls)->number); //callocで初期化されるので0 printf("%d\n",tmp->number); //10と表示 ← なぜ指すもののlsの値が変わったの //に値が変わらないのか } int main(void) { char input[12]; list *ls,ls2; ls2.number=5; ls=&ls2; test(&ls); scanf("%s",input); return 0; } void test(list **)の内容の動的確保後にポインタ変数tmpが 刺しているはずの**lsの内容が変わったのにtmpの内容が変わらない 理由がわかりません。 よろしくお願いします

  • C言語のプログラムで...

    下のプログラムは参考書にあったサンプルプログラムなのですが /* 関数の宣言 */ int print_struct(struct person dat); のところはなぜint型なのですか? #include <stdio.h> #include <string.h> /* 構造体の定義 */ struct person { char name[20]; /* 名前 */ double height; /* 身長 */ double weight; /* 体重 */ int bpl; /* 最低血圧 */ int bph; /* 最高血圧 */ }; /* 関数の宣言 */ int print_struct(struct person dat); /* main関数 */ int main(void) { /* 変数の宣言 */ struct person dat; /* 構造体のメンバーに値を代入 */ strcpy(dat.name,"山田太郎"); dat.height = 173.5; dat.weight = 63.0; dat.bpl = 98; dat.bph = 113; /* struct person関数を実行 */ print_struct(dat); return 0; } /* print_struct関数 */ int print_struct(struct person dat) { /* 画面に出力 */ printf("%s\n",dat.name); printf("%f\n",dat.height); printf("%f\n",dat.weight); printf("%d\n",dat.bpl); printf("%d\n",dat.bph); return 0; }

  • C言語について

    #include <stdio.h> struct syoukai{ int no; char name[5]; }; int main(void) { struct syoukai mine = {3, "aaaaa"}; int cmdID ; printf("コマンドを入力してください\n"); scanf("%d\n",cmdID); if(cmdID == 1) printf("%d\n",syoukai.no, syoukai.name); } これをコンパイルして実行すると Segmentation fault とエラーになってしまい原因がわかりません 教えていただけますか?

  • リスト構造のプログラミング

    #include<stdio.h> #include<stdlib.h> typedef struct number{ float x; struct number *next; }Num; void append_list(Num **, float); int main(void) { Num *start,*p; float i,d; start=NULL; for(i=0.0;i<10.0;i++){ append_list(&start,i); } p=start; while(p!=NULL){ printf("%f\n",p->x); p=p->next; } p=start; while(p !=NULL){ Num *q; q=p; p=p->next; free(q); } return 0; } void append_list(Num **s, float n) { Num *end, *new; if(*s==NULL){ *s=(Num *)malloc(sizeof(Num)*1); (*s)->x=n; (*s)->next=NULL; return; }end=(*s); while(end->next !=NULL){ end=end->next; } new=(Num *)malloc(sizeof(Num)*1); new->x=n; new->next=NULL; end->next=new; } 0~9までの数値を順番に追加してリスト構造のデータ構造で 保存するプログラミングを作ったのですが、これにキーボード から入力した1つの実数(0~9)を数値の順序を乱さないよう にその数値を持つ要素を追加するにはどうすればよいのでしょうか?

専門家に質問してみよう