목차
next
에는 다음 노드 주소값이 저장되어 있는데, 이를 해제하면 다음 노드 메모리를 해제하는 결과가 발생하기 때문이다.
예시로 다음과 같이 2개의 노드가 연결되어 있다고 해보자.
node1
의 content
를 삭제하고, node1
의 메모리를 해제 하고 싶다면, 먼저content
가 가리키고 있는 “hello” 가 점유하고 있는 메모리 공간을 삭제하는 함수 del
를 사용한다.
그 다음 포인터 변수인 node1
가 가리키고 있는 주소값을 free
한다.
만약 next
까지 해제한다면 다음과 같은 모습일 것이다.
이렇게 해제를 하면 다음 노드인 node2
의 메모리 공간이 해제되고, 해제된 공간에 다른 값이 저장되어 node2
가 가지고 있던 값이 예측할 수 없는 값으로 변경될 위험이 있다. 그렇기 때문에 next
는 메모리 해제를 하면 안된다.
삭제하고자 하는 노드가 첫 번째 노드나 마지막 노드가 아닌 중간에 있는 노드일 때, 중간 노드 앞뒤에 있는 노드들은 이어주어야 할까?
일반적인 연결리스트를 구현하고자 한다면, 이어주는 것이 맞다. 하지만, ft_lstdelone
함수의 프로토타입에는 매개변수로 삭제하고자 하는 노드에 대한 포인터만 전달된다. 즉, 이전 노드의 주소를 알 수 없으므로 다음 노드와 이어주고 싶어도 주어진ft_lstdelone
함수 내부에서는 이어줄 수 없는 것이다.
ft_lstdelone
함수에서 이전 노드와 다음 노드를 이어줄 수 있는 방법은 삭제하는 노드의 이전 노드 주소를 매개변수에 추가로 전달하는 방법이 있다. 그렇다면 함수는 다음과 같은 형태가 될 것이다.
void ft_lstdelone(t_list prev, t_list target, void(*del)(*));
또는, ft_lstdelone
함수 외부에서 삭제할 노드의 이전 노드 주소를 임시 변수에 저장하는 방법도 있다. 이는 ft_lstdelone
함수를 어떻게 활용하느냐에 따라 다르게 구현할 수 있을 것이다.