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