1. 첫번째 노드의 삭제
head 가 현재 head 노드의 다음 노드를 가리키게 만든다.
head = head -> next;
Node * remove_first () { /* 주소 리턴 */
if (head == NULL) {
return NULL;
}
else {
Node *tmp = head; /* head 노드의 주소를 임시로 보관할 포인터 */
head = head->next;
return tmp; /* head 노드의 주소 리턴 */
}
}
if 문에서 head 가 NULL 이라는 것은 연결리스트의 노드가 하나도 없음을 의미한다. 이 경우 return NULL 로 처리한다.
else문에서 head의 주소를 임시적으로 tmp 가 가지고 있게 한다. head = head -> next 에 의해 첫번째 노드를 삭제해준다.
참고로 모든 노드들은 동적할당으로 만들어졌기 때문에 필요 없어진 노드(여기선 head)는 free 시켜주는 것이 좋다.
2. 어떤 노드의 다음 노드 삭제
prev의 다음 노드가 null 이 아니라면, prev의 next 필드가 현재 next 노드의 다음 노드를 가리키게 만든다.
if (prev->next != NULL)
prev->next = prev->next->next;
이와 관련한 함수를 적으면 다음과 같다.
Node *remove_after (Node *prev) { /* 삭제된 노드 주소 반환 */
Node *tmp = prev->next;
if (tmp == NULL) { /* 삭제할 노드가 존재하지 않음 */
return NULL; /* 널 반환 */
}
else {
prev->next = tmp->next;
return tmp; /* 주소 반환 */
}
}
위의 코드는 아래 그림과 같은 상황인 것이다.
연결리스트의 어떤 노드를 삭제할 때는 삭제할 노드의 바로 앞 노드의 주소가 필요하다. 삭제할 노드의 주소만으로는 삭제할 수는 없다는 점을 기억하자.
'💡 자료구조' 카테고리의 다른 글
연결리스트 - 함수들 정리 (0) | 2021.08.04 |
---|---|
연결리스트 - 순회하기 (0) | 2021.08.04 |
연결리스트 - 삽입하기 (0) | 2021.08.02 |
연결리스트 기본 개념 (0) | 2021.08.02 |
전화번호부 v5.0 - 구조체에 대한 포인터, 동적 메모리 할당 (0) | 2021.07.11 |