#include <stdlib.h> void *bsearch(const boid *key, const void *base, size_t num, size_t width, int(*compare)(const void *elm1, const void *elm2)) key : サーチに使用されるキー base : ソートされた配列の先頭アドレス num : 配列の要素の数 width : 各要素の大きさ(バイト単位) compare : 2 つの要素を比較する関数.この関数は, compare(void *elm1, void *elm2) の形式で与えられた 2 つの要素を比較し,配列が昇順にソートされて いる場合は,次のような結果を返す必要があります.降順にソートされ ているときは,正・負の関係を入れ換えます. 負 : elm1 が elm2 より小さい 0 : elm1 と elm2 が同じ 正 : elm1 が elm2 より大きい
#include <stdio.h> #include <stdlib.h> #include <string.h> int compare_n(const void *, const void *); int compare_c(const void *, const void *); /********/ /* main */ /********/ int main(int argc, char **argv) { int i1, key_n, *res_n, data_n[10] = {10, 1, 45, 20, 0, -20, 15, 90, 5, 55}; char *key_c, **res_c, *data_c[5]; for (i1 = 0; i1 < 5; i1++) data_c[i1] = new char [10]; data_c[0] = "fish"; data_c[1] = "dog"; data_c[2] = "tree"; data_c[3] = "human"; data_c[4] = "cat"; /* 探索キー */ key_n = atoi(argv[1]); key_c = argv[2]; /* 整数の場合 */ // ソート前の出力 printf("sort前 "); for (i1 = 0; i1 < 10; i1++) printf("%d ", data_n[i1]); printf("\n"); // ソートとその後の出力 qsort(data_n, 10, sizeof(int), compare_n); printf("sort後 "); for (i1 = 0; i1 < 10; i1++) printf("%d ", data_n[i1]); printf("\n"); // 探索 res_n = (int *)bsearch(&key_n, data_n, 10, sizeof(int), compare_n); if (res_n != NULL) printf(" %d が見つかりました\n", *res_n); else printf(" %d は見つかりませんでした\n", key_n); /* 文字列の場合 */ // ソート前の出力 printf("sort前 "); for (i1 = 0; i1 < 5; i1++) printf("%s ", data_c[i1]); printf("\n"); // ソートとその後の出力 qsort(data_c, 5, sizeof(char *), compare_c); printf("sort後 "); for (i1 = 0; i1 < 5; i1++) printf("%s ", data_c[i1]); printf("\n"); // 探索 res_c = (char **)bsearch(&key_c, data_c, 5, sizeof(char *), compare_c); if (res_c != NULL) printf(" %s が見つかりました\n", *res_c); else printf(" %s は見つかりませんでした\n", key_c); return 0; } /********************/ /* 2つの整数の比較 */ /********************/ int compare_n(const void *arg1, const void *arg2) { int *a1 = (int *)arg1; int *a2 = (int *)arg2; return *a1 - *a2; } /**********************/ /* 2つの文字列の比較 */ /**********************/ int compare_c(const void *chr1, const void *chr2) { char **c1 = (char **) chr1; char **c2 = (char **) chr2; return strcmp(*c1, *c2); }
sort前 10 1 45 20 0 -20 15 90 5 55 sort後 -20 0 1 5 10 15 20 45 55 90 55 が見つかりました sort前 fish dog tree human cat sort後 cat dog fish human tree fish が見つかりました
菅沼ホーム | 本文目次 | 演習問題解答例 | 付録目次 | 索引 |