Page 346 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 346

list     …  검색 대상인 연결 리스트를 가리키는 포인터입니다.
                     x       …  검색하는 키 값을 저장한 데이터를 가리키는 포인터입니다.
                     compare  …     두 번째 매개변수 x가 가리키는 객체와 연결 리스트의 노드와 데이터를 비교하는 함수를 가리
                                키는 포인터입니다. 이 비교 함수는 검색에 성공하면 0을 반환합니다.



                     실습 9-2[B]                                             •완성 파일 chap09/LinkedList.c

                     01  /*--- compare 함수를 사용해 x를 검색합니다. ---*/
                     02  Node *search(List *list, const Member *x, int compare(const Member *x, const Member *y))
                     03  {
                     04    Node *ptr = list->head;                                1
                     05    while(ptr != NULL) {
                     06      if(compare(&ptr->data, x) == 0) { /* 키 값이 같은 경우 */
                     07        list->crnt = ptr;
                     08        return ptr;       /* 검색 성공 */                      2
                          3
                     09      }
                     10      ptr = ptr->next;     /* 다음 노드를 선택 */
                          4
                     11    }
                     12    return NULL;          /* 검색 실패 */                      5
                     13  }
                     14                                                       (실습 9-2[C]에서 계속)



                    1  스캔하고 있는 노드를 가리키는 변수 ptr을 list->head로 초기화합니다. 그림  a     와 같이

                   ptr이 가리키는 노드는 list->head가 가리키고 있는 머리 노드인 A입니다.


                    2  조건 1을 먼저 판단합니다. ptr 값이 널이 아니면 루프 본문의  3 ,  4 를 실행합니다. ptr
                    값이 널이면 스캔할 노드가 없음을 의미하기 때문에 while문을 빠져나와  5 로 진행합니다.



                    3  조건 2를 판단하기 위해 스캔하고 있는 노드의 데이터(ptr->data)와 x가 가리키는 데이터
                   를 compare 함수로 비교합니다. compare 함수는 검색에 성공하면 0을 반환합니다. 즉,

                   조건 2가 성립합니다. 곧바로 list->crnt에 ptr을 대입하고 찾은 노드에 대한 포인터인 ptr을
                   반환합니다.


                    4  ptr에 ptr->next를 대입합니다. 이렇게 하면 ptr이 다음 노드를 가리키기 때문에 계속해서

                   스캔할 수 있습니다.
                      ptr이 노드 A를 가리키는 그림  a  에서 ptr = ptr->next를 대입하면 그림  b 와 같은 상태가 됩니다. 다음 노드 B를 가리키
                   는 ptr->next를 ptr에 대입하면 ptr이 가리키는 노드가 A에서 B로 업데이트됩니다.


                   346   C 알고리즘
   341   342   343   344   345   346   347   348   349   350   351