[PR]

配列から要素を検索する

戻る

 整列済み配列から要素を検索するには関数 bsearch() を使う。


 配列から要素を検索する関数を作る。

//*********************************************************
// lsearch
//    大きさ size の要素 num 個からなる配列 array から
//    要素 key に一致する最初の要素へのポインタを返します。
//    要素 key に一致する要素がない場合には NULL が返ります。
//    要素の一致判定には、比較関数 comp が使われます。
//*********************************************************
void *
lsearch
	(
		const void   *key,
		const void   *array,
		      size_t  num,
		      size_t  size,
		int (*comp)(const void *, const void *)
	)
{
	const char *stop  = (const char *)array + ((num-1) * size);
	for( const char *p = (const char *)array; p <= stop; p = p + size )
	{
		if ( 0 == comp( p, key ) )
			return (void *)p;
	}
	return NULL;
}//lsearch

使用例

/* short 型変数値を昇順に順序づける比較関数 */
int comp_short( const void *vp, const void *vq )
{
	const short *p = (const short *)vp;
	const short *q = (const short *)vq;

	if ( *p < *q ) return -1;
	if ( *p > *q ) return  1;
	return 0;
}//comp_short

//*********************************************************
// 関数 lsearch() の使用例です。
//*********************************************************
int main( void )
{
	int    i;
	short *p;
	short  key;
	short  array[10];

	// 乱数配列作成
	srand( time(NULL) );
	for( i = 0; i < numof(array); i++ )
		array[i] = (short)rand();

	// 要素の検索
	key = array[rand() % numof(array)];
	p = (short *)lsearch( &key, array, numof(array), sizeof(short), comp_short );

	// 検索結果表示
	printf("要素 %d を検索\n", key );
	for( i = 0; i < numof(array); i++ )
		printf("%5d, ", array[i] );
	printf( "\n%*s^^^^^\n", 7*(p-array), "" );
	return 0;
}//main

実行結果

要素 24832 を検索
13411, 24624, 24811, 21124, 25038, 19778, 24832,  6673,  2401,  6831,
                                          ^^^^^

関連

配列の要素を逆順に並べ替える
配列の要素を回転移動する
整列済み配列から重複する要素を取り除く
配列が整列されているかどうか調べる
配列をランダムに並べ替える



Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp

>> 扉の外 I / II / III