MW211 EXIT

devlog
C言語/qsort()構造体配列の並び替え
2013年03月30日
qsort関数は、構造体配列も並び替えることができる。
構造体内には複数の項目があるので、そのうちキーとする項目を選び、
それに対して比較関数で並び替えの比較をするように実装する

数値項目をキーとして並び替える場合。
┌──────────────────────────────────────┐
│typedef struct {                                                            │
│    int   キー;                                                             │
│    char  その他項目[16];                                                   │
│} 構造体型;                                                                 │
│構造体型  配列[];                                                           │
│// 構造体配列にサンプルデータを設定するところは省略                         │
├──────────────────────────────────────┤
│int  配列数 = sizeof(配列) / sizeof(配列[0]);                               │
│qsort(配列, 配列数, sizeof(配列[0]), 比較関数);  // ソート実行              │
├──────────────────────────────────────┤
│// 昇順にする場合                                                           │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return  ((構造体型*)a)->キー - ((構造体型*)b)->キー;                    │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にする場合                                                           │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return  ((構造体型*)b)->キー - ((構造体型*)a)->キー;                    │
│}                                                                           │
└──────────────────────────────────────┘

文字列項目をキーとして並び替える場合。
┌──────────────────────────────────────┐
│typedef struct {                                                            │
│    char  キー[16];                                                         │
│    int   その他項目;                                                       │
│} 構造体型;                                                                 │
│構造体型  配列[];                                                           │
│// 構造体配列にサンプルデータを設定するところは省略                         │
├──────────────────────────────────────┤
│int  配列数 = sizeof(配列) / sizeof(配列[0]);                               │
│qsort(配列, 配列数, sizeof(配列[0]), 比較関数);                             │
├──────────────────────────────────────┤
│// 昇順にする場合                                                           │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return(strcmp((char*)(((構造体型*)a)->キー),                            │
│                  (char*)(((構造体型*)b)->キー)));                          │
│}                                                                           │
├──────────────────────────────────────┤
│// 降順にする場合                                                           │
│int  比較関数(const void* a, const void* b)                                 │
│{                                                                           │
│    return(strcmp((char*)(((構造体型*)b)->キー),                            │
│                  (char*)(((構造体型*)a)->キー)));                          │
│}                                                                           │
└──────────────────────────────────────┘
分類:C/C++