- ベストアンサー
C言語の構造体でバブルソートがうまくいかない
- C言語の構造体でバブルソートが上手くいかない問題について質問します。
- 構造体の身長順にバブルソートを行うソース文での結果表示が不正なため解決方法を探しています。
- 解決方法を教えていただけると助かります。回答はお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>for(i=0;i<10;i++) { >d = &data[i]; 最終的には、 dには &data[9] 、つまり、data[9]へのポインタが入っているわけです。 そして、そのまま >*d= data[i]; >data[i]= data[j]; >data[j]= *d; を実行したら *dはdata[9]になりますから data[9]= data[i]; data[i]= data[j]; data[j]= data[9]; と同じ事、となります。 一応、data[i]とdata[j]との入れ替えにはなりますが、同時にdata[i]がdata[9]へコピーされてしまい、もとあったdata[9]の内容が失われます。 最終的に、最後の入れ替えが発生したときのdata[i]と同じ値がdata[9]に入っているとこになります。 対策は、この KOJIN *d を使わないことです KOJIN temp ; としておいて temp= data[i]; data[i]= data[j]; data[j]= temp; とします。 ところで、これ、バブルソートじゃないですよ。 単純ソートというアルゴリズムになってます。 アルゴリズムの参考書等をもう一度よく確認してください。
その他の回答 (3)
- asuncion
- ベストアンサー率33% (2127/6289)
そういう表示結果を得たとき、何を入力したのでしょうか? >5つのレコードのうち1つが消えてしまい、 >残った4つのレコードのうちの1つが重複されて表示されてしまいます。 という状況が伝わっていません。
- Tacosan
- ベストアンサー率23% (3656/15482)
これで 5個のデータ「だけ」入力できるの? なにがなんでも 10個入力しないとダメな気がするんだけど.... さておき, データの入力が終わったときの d の値を調べてください. あとおまけだけど, 「身長」は length じゃなくて height ではないかな.
- trajaa
- ベストアンサー率22% (2662/11921)
お願い致します。 と言われても・・・・・ 尻切れトンボじゃ、わかりません。
補足
大変申し訳ありません‥ 携帯から投稿したのですが、まさかこんなことになっていたとは‥ 改めて、ソース全文を載せます。 何卒よろしくお願い致します。 #include<stdio.h> #include<string.h> typedef struct kojin { char name[21]; int length; int weight; }KOJIN; int main(void) { int i, c, j; char buf[4]; KOJIN data[10]; KOJIN *d; printf("\n"); for(i=0;i<10;i++) { d = &data[i]; printf("%d人目のデータ入力-------------\n",i+1); printf("名前を入力>"); fgets(d->name,21,stdin); if (strchr(d->name, '\n') != NULL) { strtok(d->name,"\n"); } else { while((c = getchar() != '\n') && (c != EOF)); } printf("身長を入力>"); fgets(buf,sizeof buf,stdin); if (strchr(buf, '\n') != NULL) { strtok(buf,"\n"); } else { while((c = getchar() != '\n') && (c != EOF)); } sscanf(buf,"%d",&d->length); printf("体重を入力>"); fgets(buf,sizeof buf,stdin); if (strchr(buf, '\n') != NULL) { strtok(buf,"\n"); } else { while((c = getchar() != '\n') && (c != EOF)); } sscanf(buf,"%d",&d->weight); } for (i=0 ; i<10 ; i++) { for (j=9 ; j>i ; j--) { if ( data[i].length > data[j].length ) { *d = data[i]; data[i] = data[j]; data[j] = *d; } } } printf("\n"); for(i=0;i<10;i++) { d = &data[i]; printf("レコード=%d %-20s 身長=%dcm 体重=%dkg\n" ,i+1,d->name,d->length,d->weight); } return 0; } ----------------------<表示結果>---------------------- レコード=1 g h 身長=164cm 体重=57kg レコード=2 e e 身長=169cm 体重=66kg レコード=3 s y 身長=172cm 体重=65kg レコード=4 a a 身長=176cm 体重=70kg レコード=5 a a 身長=176cm 体重=70kg ------------------------------------------------------
お礼
言われたとおりにして、無事解決することができました。 本当にありがとうございました。 問題となったソース文は、temp等にすることで、上手くいき、 ポインタ(*d)ではダメということでしたね‥。 よい勉強をさせていただきました。 他の皆様も、ご意見をいただきありがとうございました。