Page 119 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 119
*a
*b
음수 *a가 작으면 음수 값을 반환합니다.
*a *b
0 *a와 *b가 같으면 0을 반환합니다.
*b
*a
양수 *a가 크면 양수 값을 반환합니다.
[그림 3-8] 비교 함수
오른쪽은 실습 3-5의 비교 함수 int_cmp입니다. 비교 /*--- 정수를 비교하는 함수(오름차순용) ---*/
int int_cmp(const int *a, const int *b)
대상은 첫 번째 인수 a가 가리키는 객체 *a의 값과 두 번 {
if(*a < *b)
째 인수 b가 가리키는 객체 *b의 값입니다. 앞의 것이
return -1;
작으면 –1, 크면 1, 같으면 0을 반환합니다. else if(*a > *b)
return 1;
else
return 0;
오른쪽의 코드를 조건 연산자를 사용하여 수정하면 오 }
른쪽 아래 코드처럼 프로그램이 짧고 간결해집니다. /*--- 조건 연산자를 사용한 비교 함수 ---*/
int int_cmp(const int *a, const int *b)
{
return *a < *b ? -1 : *a > *b ? 1 : 0;
}
bsearch 함수의 호출
비교 함수 int_cmp가 받는 인수의 자료형은 int *이고 bsearch 함수가 받는 비교 함수의 인
수의 자료형은 void *입니다. 두 자료형이 다르므로 bsearch 함수의 호출에 맞도록 형 변환
을 해야 합니다. 이 프로그램에서는 초록색으로 표시하는 방법으로 형 변환을 수행합니다.
p = bsearch(&ky, /* 검색값에 대한 포인터 */
x, /* 배열 */
nx, /* 요소의 개수 */
sizeof(int), /* 요소의 크기 */
(int(*)(const void *, const void *)) int_cmp /* 비교 함수 */
);
하지만 int_cmp 함수를 다음과 같이 정의하면 호출할 때 형 변환을 하지 않아도 됩니다. 대신
비교 함수 안에서 형 변환을 많이 할 수도 있으므로 필요에 따라 함수를 구현하여 형 변환하면
됩니다.
03•검색 119