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

원형 이중 연결 리스트를 초기화하는 Initialize 함수

                        Initialize 함수는 텅 비어 있는 상태의 원형 이중 연결 리스트를 만드는 함수로 그림 9-22와
                        같이 비어 있는 상태의 노드 1개를 만들어 리스트를 초기화합니다. 초기화를 통해 만들어낸
                        노드는 노드의 삽입, 삭제를 수행하기 위해 리스트의 머리에 위치하고 더미 노드라고 부릅니
                        다. 더미 노드를 만든 다음에는 더미 노드의 앞쪽 포인터 prev와 뒤쪽 포인터 next 모두 자기

                        자신(더미 노드)을 가리키도록 설정하면 초기화가 끝납니다.


                         더미 노드만 있는 상태입니다.      head
                                                                    자기 자신을 가리킵니다.
                                                            -
                                                                    자기 자신을 가리킵니다.

                                      [그림 9-22] 원형 이중 연결 리스트를 초기화한 상태


                        리스트가 비어 있는지 검사하는 IsEmpty 함수
                        IsEmpty 함수는 리스트가 비어 있는지를 검사하는 함수입니다. 더미 노드의 뒤쪽 포인터
                        list->head->next가 더미 노드인 list->head를 가리키면 비어 있는 상태라고 판단합니다.
                        비어 있는 상태의 리스트는 list->head, 더미 노드의 앞쪽 포인터인 list->head->prev, 더미

                        노드의 뒤쪽 포인터인 list->head->next의 3개 모두 더미 노드를 가리킵니다. 함수의 반환
                        값은 리스트가 비어 있는 경우에는 1입니다(아닌 경우에는 0).
                           그림 9-22를 참고하세요.


                        선택한 노드의 데이터를 출력하는 PrintCurrent / PrintLnCurrent 함수

                        PrintCurrent, PrintLnCurrent 함수는 선택한 노드의 데이터를 출력하는 함수입니다. 다시
                        말해 list->crnt가 가리키는 노드의 데이터를 PrintMember 함수를 이용해 출력합니다. 리스
                        트가 비어 있는 경우에는 ‘선택한 노드가 없습니다.’라는 메시지를 출력합니다.


                         실습 9-8[B]                                        •완성 파일 chap09/CircDblLinkedList.c
                         01  /*--- compare 함수로 x와 일치하는 노드를 검색 ---*/
                         02  Dnode *Search (Dlist *list, const Member *x,
                         03                int compare (const Member *x, const Member *y))
                         04  {
                         05    Dnode *ptr = list->head->next;
                         06    while(ptr != list->head)
                         07      if(compare(&ptr->data, x) == 0)
                         08        list->crnt = ptr;




                                                                                         09•리스트  387
   382   383   384   385   386   387   388   389   390   391   392