| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- 기초
- 이진 탐색 트리
- 비트코인
- #선물 #비트코인#알트코인#매매#코인#마진
- array
- 순회
- BST
- 바이낸스
- 자료구조
- 트리
- trading view
- Data Structure
- 알고리즘
- 연결 리스트
- Windows
- Basic
- 후위
- Tree
- linked list
- 문자열
- mutable
- 숫자
- Python
- 선물
- 전위
- template
- 오버로딩
- 템플릿 함수화
- C++
- SCM
Archives
- Today
- Total
Project Hub
[Data Structure] Doubly Linked List 본문
728x90
반응형
이중 연결 리스트 (Doubly Linked List)
- 각 노드가 선행 노드와 후속 노드에 대한 링크를 가지는 리스트
저번에 구현한 단일 연결 리스트에 이어서 이중 연결 리스트를 구현해봤다.
크게 어려운 것은 없었지만, 노드와 노드간 관계를 재정의 하는 것 (추가, 삭제 등)에 있어서 주의가 필요할 듯 하다.
이중 연결 리스트의 구조는 아래 그림을 참고하면 된다.
여기서 head / tail 노드는 관리를 위한 노드며, 데이터는 없다.

template 를 이용하여 이중 연결 리스트 클래스를 먼저 구현해보았다.
이중 연결 리스트의 데이터 구조
- Node 구조체
struct Node
{
int iValue;
Node *next; // 다음 노드
Node *prev; // 이전 노드
};
- 연결 리스트 관리 구조체
struct List
{
Node *Head;
Node *Tail;
int iSize;
};
이중 연결 리스트 클래스
template<typename T>
class CDoublyLinkedList
{
public:
CDoublyLinkedList(): m_List(NULL) {};
~CDoublyLinkedList() {};
public:
bool CreateList()
{
bool bRet = false;
for (;;)
{
m_List = (List<T>*)malloc(sizeof(List<T>));
if (NULL == m_List)
break;
m_List->Head = (Node<T>*)malloc(sizeof(Node<T>));
if (NULL == m_List->Head)
{
free(m_List);
break;
}
m_List->Tail = (Node<T>*)malloc(sizeof(Node<T>));
if (NULL == m_List->Tail)
{
free(m_List);
free(m_List->Head);
break;
}
m_List->Head->next = m_List->Tail;
m_List->Head->prev = m_List->Head;
m_List->Tail->next = m_List->Tail;
m_List->Tail->prev = m_List->Head;
m_List->iSize = 0;
bRet = true;
break;
}
return bRet;
}
bool InsertHead(T _Value)
{
if (NULL == m_List)
return false;
bool bRet = true;
Node<T> *newNode = (Node<T>*)malloc(sizeof(Node<T>));
if (NULL == newNode)
return false;
newNode->Value = _Value;
newNode->next = m_List->Head->next;
newNode->prev = m_List->Head;
m_List->Head->next->prev = newNode;
m_List->Head->next = newNode;
m_List->iSize++;
return bRet;
}
bool InsertTail(T _Value)
{
if (NULL == m_List)
return false;
bool bRet = true;
Node<T> *newNode = (Node<T>*)malloc(sizeof(Node<T>));
if (NULL == newNode)
return false;
newNode->Value = _Value;
newNode->prev = m_List->Tail->prev;
newNode->next = m_List->Tail;
m_List->Tail->prev->next = newNode;
m_List->Tail->prev = newNode;
m_List->iSize++;
return bRet;
}
bool removeHead()
{
if (NULL == m_List)
return false;
bool bRet = true;
Node<T> *node;
if (m_List->Tail != m_List->Head->next)
{
node = m_List->Head->next;
m_List->Head->next->next->prev = m_List->Head;
m_List->Head->next = m_List->Head->next->next;
free(node);
node = NULL;
m_List->iSize--;
}
else
{
bRet = false;
}
return bRet;
}
bool removeTail()
{
if (NULL == m_List)
return false;
bool bRet = true;
Node<T> *node;
if (m_List->Head != m_List->Tail->prev)
{
node = m_List->Tail->prev;
m_List->Tail->prev->prev->next = m_List->Tail;
m_List->Tail->prev = m_List->Tail->prev->prev;
free(node);
node = NULL;
m_List->iSize--;
}
else
{
bRet = false;
}
return bRet;
}
Node<T>* SearchNode(T _Value)
{
if (NULL == m_List)
return NULL;
Node<T> *node;
node = m_List->Head->next;
while (m_List->Tail != node)
{
if (_Value == node->Value)
break;
node = node->next;
}
if (m_List->Tail == node)
return NULL;
else
return node;
}
bool RemoveNode(T _Value)
{
if (NULL == m_List)
return false;
bool bRet = true;
Node<T> * node;
node = SearchNode(_Value);
if (NULL == node)
return false;
node->prev->next = node->next;
node->next->prev = node->prev;
free(node);
node = NULL;
m_List->iSize--;
return bRet;
}
bool DestroyList()
{
Node<T> *curNode;
Node<T> *nextNode;
curNode = m_List->Head->next;
while (m_List->Tail != curNode)
{
nextNode = curNode->next;
free(curNode);
curNode = nextNode;
}
free(m_List->Head);
free(m_List->Tail);
m_List->Head = m_List->Tail = NULL;
free(m_List);
m_List = NULL;
return true;
}
private:
List<T> *m_List;
};728x90
반응형
'Data Structure > Linked List' 카테고리의 다른 글
| [Data Structure] Singly Linked List (3) | 2022.08.16 |
|---|
Comments