C言語関係掲示板

過去ログ

No.241.構造体を複数のキーでソート


No.1457

構造体のソート
投稿者---KEISUKE(2002/04/25 14:54:28)


構造体のソートについて、教えてください。
構造体の複数のキーでソートしたいのですが。

typedef  struct
 {
  char name[50 + 1];   /*名前  */
  char age[3 + 1];    /*年齢  */
  char nensuu[3 + 1];   /*勤続年数*/
 }DateTbl;

年齢と勤続年数で昇順にソートする。

よろしくお願いします。

No.1459

Re:構造体のソート
投稿者---かずま(2002/04/25 18:38:02)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char name[50 + 1];  /*名前*/
    char age[3 + 1];    /*年齢*/
    char nensuu[3 + 1]; /*勤続年数*/
} DateTbl;

DateTbl data[] = {
    { "Sato",   " 35", " 17" },
    { "Suzuki", " 54", " 32" },
    { "Tanaka", " 28", "  6" },
    { "Toyota", " 35", " 13" },
    { "Honda",  " 28", " 10" },
};

int comp(const void *p1, const void *p2)
{
    const DateTbl *a = p1, *b = p2;
    int diff = strcmp(a->age, b->age);

    return diff ? diff : strcmp(a->nensuu, b->nensuu);
}

int main()
{
    const int n = sizeof data / sizeof data[0];
    int i;

    qsort(data, n, sizeof(DateTbl), comp);

    for (i = 0; i < n; i++)
        printf("%s %s  %s\n", data[i].age, data[i].nensuu, data[i].name);

    return 0;
}

----------------------------------------------------------------------
サイズの大きい構造体を並べ替えるのは時間が無駄なので、ポインタを使うと、

int comp(const void *p1, const void *p2)
{
    DateTbl *const *a = p1;
    DateTbl *const *b = p2;
    int diff = strcmp((*a)->age, (*b)->age);

    return diff ? diff : strcmp((*a)->nensuu, (*b)->nensuu);
}

int main()
{
    const int n = sizeof data / sizeof data[0];
    int i;
    DateTbl **p = malloc(n * sizeof(DateTbl *));

    for (i = 0; i < n; i++)
        p[i] = &data[i];

    qsort(p, n, sizeof(DateTbl *), comp);

    for (i = 0; i < n; i++)
        printf("%s %s  %s\n", p[i]->age, p[i]->nensuu, p[i]->name);

    free(p);
    return 0;
}

----------------------------------------------------------------------
構造体のサイズを小さくしてしまうという手もありますね。

typedef struct {
    char *name;  /*名前*/
    int  age;    /*年齢*/
    int  nensuu; /*勤続年数*/
} DateTbl;

DateTbl data[] = {
    { "Sato",   35, 17 },
    { "Suzuki", 54, 32 },
    { "Tanaka", 28,  6 },
    { "Toyota", 35, 13 },
    { "Honda",  28, 10 },
};

int comp(const void *p1, const void *p2)
{
    const DateTbl *a = p1, *b = p2;
    int diff = a->age - b->age;

    return diff ? diff : a->nensuu - b->nensuu;
}

int main()
{
    const int n = sizeof data / sizeof data[0];
    int i;

    qsort(data, n, sizeof(DateTbl), comp);

    for (i = 0; i < n; i++)
        printf("%3d %3d  %s\n", data[i].age, data[i].nensuu, data[i].name);

    return 0;
}



No.1461

Re:構造体のソート
投稿者---かずま(2002/04/26 10:42:20)


> 構造体のサイズを小さくしてしまうという手もありますね。
>
> typedef struct {
>     char *name;  /*名前*/
>     int  age;    /*年齢*/
>     int  nensuu; /*勤続年数*/
> } DateTbl;
サイズを小さくしたいんだから、int を short または char に変えたほうがいいでしょう。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.06.22
Copyright(c) 2000-2002 TOMOJI All Rights Reserved