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
   114   115   116   117   118   119   120   121   122   123   124