cwnicol programming

プログラミング関連の投稿をすこしだけ

c言語 qsort

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

#define SIZE 10

typedef struct{
	int i;
	char str[5];
} hoge;

int Comp(const void *, const void *);
void print(hoge *);


// メイン
int main(){

	hoge shoge[SIZE] = 
		{
			{3, "abc"},
			{1, "ABC"},
			{9, "uyr"},
			{2, "4gy"},
			{4, "stg"},
			{0, "ggg"},
			{8, "1gv"},
			{3, "fyg"},
			{7, "chr"},
			{2, "bga"},
		};

	print(shoge);
	
	qsort(&shoge, SIZE, sizeof(hoge), Comp);
	
	print(shoge);
	
	return 0;
}


// 比較用関数
int Comp(const void *p1, const void *p2){

	const hoge *psp1 = (hoge *)p1;
	const hoge *psp2 = (hoge *)p2;
	
	if(psp1->i < psp2->i){
		return -1;
	}else if(psp1->i > psp2->i){
		return 1;
	}else{
		return 0;
	}
}


// 表示関数
void print(hoge *pshoge){	

	int i;

	for(i = 0; i < SIZE; i++){
		printf("%d %s\n", pshoge[i].i, pshoge[i].str);
	}
	
	printf("\n\n");
	
	return;
}
【実行結果】
3 abc
1 ABC
9 uyr
2 4gy
4 stg
0 ggg
8 1gv
3 fyg
7 chr
2 bga


0 ggg
1 ABC
2 bga
2 4gy
3 abc
3 fyg
4 stg
7 chr
8 1gv
9 uyr
★ポイント
・比較用の関数を新たの定義すること。
 名前は自由。
 比較するのが構造体なら、どれを「比較キー」にするかを
 決めて、処理を作る。
 
   要素1が要素2の前に来るときにはマイナス値を返す
 逆に要素2が要素1の前に来るときには プラス値を返す。
 どちらが前でも良いときには、0を返す。
 
 比較関数のパラメータは常にconst void *。
 関数呼び出し直後に比較する要素の型にキャストする。
 
・qsort(並び替え対象ポインタ ・・・通常は配列名など
   , 並び替え対象内の要素の個数
   , 1つの要素のサイズ   ・・・sizeof()などで指定
   , 比較関数        ・・・比較関数の関数名を指定
   );