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

a  삭제 전  head                                                  삭제 전
                                                     ptr    crnt                       삭제 후
                                      A       B      C      D       E      F

                                                          1
                        b  삭제 후  head
                                                                해제합니다.
                                                     ptr
                                      A       B      C      D       E      F
                                                         2
                                                             삭제하기 전의 다음 다음 노드를 가리킵니다.

                                                [그림 9-12] 노드를 삭제하는 과정


                        처리 과정은 다음과 같습니다.

                           실습 9-2[E]의 과정에서 붙인 번호를 그대로 사용했습니다.


                        1  선택한 노드의 앞 노드를 찾습니다. while문은 머리 노드부터 스캔을 시작합니다. 선택한
                        노드 ptr의 다음 노드를 가리키는 포인터 ptr->next가 list->crnt와 같을 때까지 반복합니다.
                        while문이 종료되고 난 다음 ptr이 가리키는 노드는 삭제하기 위해 선택한 노드 D의 앞쪽 노
                        드인 노드 C가 됩니다.



                        2  삭제하기 위해 선택한 노드 D의 다음 노드 포인터 list->crnt->next를 노드 C의 다음 노드
                        포인터 ptr->next에 대입합니다. 그러면 노드 C의 다음 노드 포인터가 가리키는 노드가 노드

                        E로 업데이트됩니다. 그런 다음 노드 D의 메모리 영역을 해제합니다.
                           선택한 노드 crnt가 가리키는 노드는 삭제한 노드의 앞 노드(노드 C)로 업데이트됩니다.


                         실습 9-2[E]                                             •완성 파일 chap09/LinkedList.c
                         01  /*--- 선택한 노드를 삭제하는 함수 ---*/
                         02  void RemoveCurrent (List *list)
                         03  {
                         04    if(list->head != NULL) {
                         05      if(list->crnt == list->head)         /* 머리 노드를 선택한 상태라면 */
                         06        RemoveFront(list);               /* 머리 노드를 삭제 */
                         07      else {
                         08        Node *ptr = list->head;
                         09        while(ptr->next != list->crnt)  1
                         10          ptr = ptr->next;
                         11        ptr->next = list->crnt->next;
                                                               1
                         12        free(list->crnt);


                                                                                         09•리스트  353
   348   349   350   351   352   353   354   355   356   357   358