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 알고리즘