• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語 構造体の並び替え )

C言語構造体の並び替え方法とデータ一覧表示の自作関数について

このQ&Aのポイント
  • C言語で構造体の並び替えとデータ一覧表示を自作関数で行う方法についてご説明します。
  • 構造体を使用してデータを管理する際、データの順序を整理する必要がある場合があります。本記事では、C言語の構造体をアルファベット順に並び替える方法と、自作関数を使用してデータ一覧を表示する方法を解説します。
  • 具体的な手順としては、まず構造体の配列にデータを入力し、自作関数を使用してmozi要素でソートします。その後、ソートされたデータを順に表示することで、mozi要素がアルファベット順に並んだデータ一覧を取得できます。

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

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

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct {   char mozi[10];   char namae[30]; } PE; void input_profile(PE *p,int *a); void printf_profile(PE *p,int *a); int comp_profile(const void* vx, const void* vy) {   const PE* px = (const PE*)vx;   const PE* py = (const PE*)vy;   return strcmp(px->mozi, py->mozi); } int main(void) {   int i = 0;   PE c[999];   input_profile(c,&i);   qsort(c, i, sizeof(PE), &comp_profile);   printf_profile(c,&i);   return 0; } /* あとは同じ */

saya19
質問者

お礼

ありがとうございました できました

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

「ソート」で検索すればいくらでもサンプルコードが見付かります。 サンプルコードでは、大抵数値(intとかdoubleとか)の配列の並び換えになっていますが、少し変えると構造体にも使えます。 ・不等号では期待する比較にできないので、比較用関数でも用意する。 ・構造体の配列そのものを並びかえるなら、サンプルでintとかになっているところを構造体に変更するだけです。 構造体の作り方によってはコピーが期待通りにならない、という問題はありますが、今回のなら大丈夫です。詳しくは「浅いコピー 深いコピー」で検索。 あと、パフォーマンスは悪いです。 ・元のデータはそのまま、ポインタの配列を使うのが、よくある方法です。 PE *pp[999] ; の様に用意し pp[0]=&p[0],pp[1]=&p[1] ... という内容にして、p[i]ではなく*(pp[i])を使って比較し配列ppを並び換えるものです。 同様に、インデックスの配列でやる方法もあります。 (int idx[999] ;pp[0]=0,pp[1]=1...p[i]ではなくp[idx[i]]で比較、idxを並び換える。) ・一番最初に表示するものを検索→表示(表示したことをフラグ用の配列にでも覚えておく) 残ってる中で、一番最初に表示するものを検索→表示 ..を繰り返す。「選択ソート」のアルゴリズムで、実際の並び換えを行わないものです。 これもパフォーマンスはわるいですが。 それから、せっかくinput_profileとprintf_profileとに機能を分けているですから、inputの中でprintするのはどうかと設計的にどうか、と思います。 input_profile(c,&i); printf_profile(c,i); のように使うのが一般的です。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

ソート(sort)って聞いたことありませんか? 一番単純なのがバブルソートですので、処理時間がかかっても良いならバブルソートについて調べてみて、それで作ってみましょう。すごく簡単ですよ。 注意点としては、moziの大小比較をどうするかです。私なら、strcmp関数を使います。 http://stocks.finance.yahoo.co.jp/stocks/chart/?code=5012.T 関数の作り方はご存知ですよね? 

関連するQ&A