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)