아래 그림처럼 노드의 왼쪽 링크(left link)와 오른쪽 링크(right link)가 각각 다른 노드의 오른쪽 링크와 왼쪽 링크를 연결짓고 있으며 특별하게 헤드도 노드로 이루어져 있습니다.
헤드노드
헤드노드는 데이터를 가지지 않고 오로지 삽입, 삭제 코드를 간단하게 할 목적으로 만들어진 노드입니다. 따라서 헤드 포인터와의 구별이 필요하며 리스트가 공백상태라면 헤드 노드만 존재하는 상태입니다. 이때 헤드노드의 left link는 right link를 가리키며 right link는 left link를 가리키는 상태입니다.
삽입 연산
new_node를 before의 앞쪽에 삽입하는 연산입니다.
(1)은 new_node의 llink가 before를 가리키게 합니다.
(2)는 new_node의 rlink가 before의 rlink를 가리키게 합니다.
(3)은 before의 rlink의 llink가 new_node를 가리키게 합니다.
(4)는 before의 rlink가 new_node를 가리키게 합니다.
이상적인 실행순서는 (1) -> (2) -> (3) -> (4) 이지만 순서마다 경우의 차이가 있을 수 있습니다.
(1)의 경우 순서의 상관없이 아무 때나 실행해도 됩니다.
(2)의 경우 반드시 (4)보다는 먼저 실행되어야 합니다.
(3)의 경우 반드시 (4)보다는 먼저 실행되어야 합니다.
(4)의 경우 반드시 (2)와 (3)보다 먼저 실행되어서는 안되며 절대 첫 순서로 실행되어서는 안됩니다.
삭제 연산
삭제하려는 노드를 removed 변수로 받아서 삭제 연산을 수행합니다. 기본적으로 삭제할 노드의 이중 연결을 해제하는 형식입니다.
// 특정한 값을 탐색
DListNode* search(DListNode* head, element data)
{
DListNode* p;
for (p = head->rlink; p != head; p = p->rlink) {
if (p->data == data) return p;
}
return NULL;
}