Double Linked List 데이터 삭제하기(Delete)

Jaden·2023년 5월 14일
0
int main(){
	Node* head = NULL;
	insertAtTail(2);
	insertAtTail(4);
	insertAtTail(6);
	Delete(1);
}

void Delete(int n){
	int i;
	Node* tmp = head;
	if(n == 1){
		head = tmp -> next;
		tmp -> next -> prev = NULL;
		free(tmp);
		return;
	}
	for(i = 0; i <= n-2; i++){
		tmp = tmp -> next;
	}
	tmp -> prev -> next = tmp -> next;
	if(tmp -> next != NULL){
		tmp -> next -> prev = tmp -> prev;
	}
	free(tmp);
}

main을 보자.

//main 
	Node* head = NULL;
	insertAtTail(2);
	insertAtTail(4);
	insertAtTail(6);

를 마치고 나면, 다음과 같은 형태가 된다.

//main 
	Delete(1);

Delete 함수에 1을 파라미터로 준다.

이제, Delete 함수를 자세히 살펴보자.

void Delete(int n){
	int i;
	Node* tmp = head;
	if(n == 1){
		head = tmp -> next;
		tmp -> next -> prev = NULL;
		free(tmp);
		return;
	}
	for(i = 0; i <= n-2; i++){
		tmp = tmp -> next;
	}
	tmp -> prev -> next = tmp -> next;
	if(tmp -> next != NULL){
		tmp -> next -> prev = tmp -> prev;
	}
	free(tmp);
}

한 라인씩 확인해본다.

//Delete function
	int i;
	Node* tmp = head;

node 포인트 타입의 tmp 변수가 head를 가리킨다.

//Delete function
	if(n == 1){
		head = tmp -> next;
		tmp -> next -> prev = NULL;
		free(tmp);
		return;
	}

파라미터로 1이 들어왔으므로 n == 1이다.
if문에 진입한다.

tmp -> next는 주소가 100인 두번째 노드를 말하므로, head가 이 두번째 노드를 가리키도록 한다.

tmp -> next는 주소가 100인 두번째 노드이고, 그것의 prev에 NULL을 넣는다.

free를 통해 힙에 있던 주소 400영역을 지운다.
return하며 끝난다.



Delete(1)이 아니라 Delete(2)을 한다면 어떨까?

int main(){
	Node* head = NULL;
	insertAtTail(2);
	insertAtTail(4);
	insertAtTail(6);
	Delete(2);
}

main을 보자.

//main 
	Node* head = NULL;
	insertAtTail(2);
	insertAtTail(4);
	insertAtTail(6);

를 마치고 나면, 다음과 같은 형태가 된다.

//main 
	Delete(2);

Delete 함수에 2을 파라미터로 준다.

이제, Delete 함수를 자세히 살펴보자.

void Delete(int n){
	int i;
	Node* tmp = head;
	if(n == 1){
		head = tmp -> next;
		tmp -> next -> prev = NULL;
		free(tmp);
		return;
	}
	for(i = 0; i <= n-2; i++){
		tmp = tmp -> next;
	}
	tmp -> prev -> next = tmp -> next;
	if(tmp -> next != NULL){
		tmp -> next -> prev = tmp -> prev;
	}
	free(tmp);
}

한 라인씩 확인해본다.

//Delete function
	int i;
	Node* tmp = head;


n == 2이므로 if문에 진입하지 않는다. 바로 for문을 살펴보자.

//Delete function
	for(i = 0; i <= n-2; i++){
		tmp = tmp -> next;
	}

n == 2이므로 i가 0으로 시작하여 0까지, for문은 단 한번 실행된다.

tmp -> next 는 주소가 100인 두번째 노드를 의미한다.
따라서 tmp는 주소가 100인 노드를 가리킨다.

//Delete function
	tmp -> prev -> next = tmp -> next;

tmp -> prev는 주소가 400인 노드를 의미하고, 그의 next에 tmp -> next를 넣는다.
tmp -> next는 700인 노드를 의미하므로 주소 400 노드의 next가 주소 700의 노드를 가리킨다.

//Delete function
	if(tmp -> next != NULL){
		tmp -> next -> prev = tmp -> prev;
	}

tmp -> next 는 주소 700을 가리키고 있으므로 if문의 조건에 성립하여 if 문에 진입한다.

tmp -> next -> prev, 즉 주소 700 노드의 prev로 tmp -> prev인 주소 400 노드를 가리킨다.

//Delete function
	if(tmp -> next != NULL){
		tmp -> next -> prev = tmp -> prev;
	}
	free(tmp);

tmp 즉, 주소 100 노드를 free시킨다.



마지막 노드를 삭제한다면 어떨까?
Delete(3)을 해보자.

int main(){
	Node* head = NULL;
	insertAtTail(2);
	insertAtTail(4);
	insertAtTail(6);
	Delete(3);
}

main이다.

//main 
	Node* head = NULL;
	insertAtTail(2);
	insertAtTail(4);
	insertAtTail(6);

를 마치고 나면, 다음과 같은 형태가 된다.

//main 
	Delete(3);

Delete 함수에 3을 파라미터로 준다.

이제, Delete 함수를 자세히 살펴보자.

void Delete(int n){
	int i;
	Node* tmp = head;
	if(n == 1){
		head = tmp -> next;
		tmp -> next -> prev = NULL;
		free(tmp);
		return;
	}
	for(i = 0; i <= n-2; i++){
		tmp = tmp -> next;
	}
	tmp -> prev -> next = tmp -> next;
	if(tmp -> next != NULL){
		tmp -> next -> prev = tmp -> prev;
	}
	free(tmp);
}

한 라인씩 확인해본다.

//Delete function
	int i;
	Node* tmp = head;


n == 3이므로 if문에 진입하지 않는다.
for문이다.

//Delete function
	for(i = 0; i <= n-2; i++){
		tmp = tmp -> next;
	}

n == 3이므로 i가 0으로 시작하여 1까지, for문은 2번 실행된다.

for문이 한 번 실행되고 나면, 다음과 같다.

for문이 두 번 실행되고 나면, 다음이 된다.

//Delete function
	tmp -> prev -> next = tmp -> next;

tmp -> prev는 주소가 100인 노드를 의미하고, 그의 next에 tmp -> next를 넣는다.
tmp -> next는 NULL이므로 주소 100 노드의 next가 NULL을 가리킨다.

//Delete function
	if(tmp -> next != NULL){
		tmp -> next -> prev = tmp -> prev;
	}

tmp -> next 가 NULL이므로 if문에 진입하지 않는다.

//Delete function
	free(tmp);

마지막 노드를 free한다.



첫 노드 삭제, 중간 노드 삭제, 마지막 노드 삭제를 모두 확인해봤다.

정리

Delete함수는 다음과 같이 동작한다.
1. tmp가 지우고자 하는 노드를 가리키도록 tmp를 이동
2. tmp의 prev와 next를 조정
3. free(tmp)

0개의 댓글