web-dev-qa-db-ja.com

構造体の配列でqsortを使用するのに助けが必要

今、いろいろな例を見てきましたが、その意味がわかりません。

これが私の構造です

typedef struct profile{
    char gender[1];
    double soc;
       . . .
} PROFILE;

ここで、socは、ソートする社会保障番号です。

比較機能が必要なのはわかっていますが、必要なものを思いつく方法はわかりません。

11

Cの構造体の配列にqsortを使用する例を次に示します

/* qsort example */
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int price;
    int id;
} order;
order list[6];
int i = 0;

int compare (const void * a, const void * b)
{

  order *orderA = (order *)a;
  order *orderB = (order *)b;

  return ( orderB->price - orderA->price );
}

int main ()
{
    srand ( time(NULL) );

    printf("Before sorting\n");
    for(i=0; i<6; i++){ 
        list[i].price = Rand()%10;
        list[i].id = i; 
        printf ("Order id = %d Price = %d \n",list[i].id, list[i].price);           
    }
    printf("AFTER sorting\n");
    int n;
    qsort (list, 6, sizeof(order), compare);
    for (n=0; n<6; n++)
         printf ("Order id = %d Price = %d \n",list[n].id, list[n].price);          
    return 0;
}

それが役に立てば幸い

カテリーナ・ディミトリス

(すべてpitsiに関して)

24
koko.auth

厳密バージョンのコンパレータは、2つの定数voidポインタを取ります。

int compare(const void *v1, const void *v2)
{
    const struct profile *p1 = v1;
    const struct profile *p2 = v2;
    if (p1->gender > p2->gender)
        return(+1);
    else if (p1->gender < p2->gender)
        return(-1);
    else if (p1->soc > p2->soc)
        return(+1);
    else if (p1->soc < p2->soc)
        return(-1);
    else
        return(0);
}

これは、まず性別フィールドを比較し、次にsocフィールドを比較します。これは、マルチパート比較を処理する方法です。

5