DLL은 Double Linked List의 약자이며
데이터들을 저장하기위해 사용되는 데이터 구조이다.
SLL과 다르게 데이터들이 두 방향으로 연결 되어있는 것을 말한다.
이는 Node를 이용하여 데이터와
다음 방향의 노드를 가리킬 Next 포인터,
그리고 이전 방향의 노드를 가리킬 Prev 포인터를 이용한다.
#define MAX_NODE 10000
struct Node {
int data;
Node* prev;
Node* next;
};
Node node[MAX_NODE];
int nodeCnt;
Node* head;
Node* getNode(int data) {
node[nodeCnt].data = data;
node[nodeCnt].prev = nullptr;
node[nodeCnt].next = nullptr;
return &node[nodeCnt++];
}
void init()
{
if (head != 0)
{
head->next = 0;
head->prev = 0;
}
}
void addNode2Head(int data)
{
Node* node = getNode(data);
if (head == 0)
{
head = node;
return;
}
node->next = head;
head->prev = node;
head = node;
}
void addNode2Tail(int data)
{
Node* temp = head;
Node* node = getNode(data);
while (temp->next != 0)
{
temp = temp->next;
}
node->prev = temp;
temp->next = node;
}
void addNode2Num(int data, int num)
{
Node* temp_prev = head;
Node* node = getNode(data);
if (num == 1)
{
node->next = head;
head->prev = node;
head = node;
return;
}
else
{
for (int i = 0; i < num - 1; i++)
{
if (i > 0)
{
temp_prev = temp_prev->next;
}
}
if (temp_prev->next != 0)
{
node->next = temp_prev->next;
temp_prev->next->prev = node;
}
node->prev = temp_prev;
temp_prev->next = node;
}
}
int findNode(int data)
{
Node* temp = head;
int cnt = 1;
while (1)
{
if (temp->data == data)
{
break;
}
temp = temp->next;
cnt++;
}
return cnt;
}
void removeNode(int data)
{
Node* temp = head;
if (head->data == data)
{
head = head->next;
head->prev = 0;
return;
}
while (temp->next != 0 && temp->next->data != data)
{
temp = temp->next;
}
if (temp->next != 0)
{
temp->next = temp->next->next;
if (temp->next!= 0)
{
temp->next->prev = temp;
}
}
}
int getList(int output[MAX_NODE])
{
int cnt = 0;
Node* temp = head;
if (head != 0)
{
while (1)
{
output[cnt] = temp->data;
if (temp->next == 0)
{
break;
}
temp = temp->next;
cnt++;
}
}
return cnt + 1;
}
int getReversedList(int output[MAX_NODE])
{
int cnt = 0;
Node* temp = head;
while (temp->next != 0)
{
temp = temp->next;
}
if (temp != 0)
{
while (1)
{
output[cnt] = temp->data;
if (temp == head)
{
break;
}
temp = temp->prev;
cnt++;
}
}
return cnt + 1;
}
getNode 함수는 새로운 data값을 갖는 노드를 생성하는 것.
addNode2Head 함수는 Linked List의 맨 앞 부분에 새로운 노드를 추가하는 것
addNode2Tail 함수는 Linked List의 맨 끝 부분에 새로운 노드를 추가하는 것
addNode2Num 함수는 Linked List에서 num에 해당하는 순서에 새로운 노드를 추가하는 것
findNode 함수는 Linked List에서 해당 data 값을 갖는 node의 순서를 반환하는 것
removeNode 함수는 Linked List에서 해당 data 값을 갖는 node를 삭제하는 것
getList 함수는 output에 data 값들을 모두 저장하고 총 노드의 개수를 반환하는 것
getReversedList 함수는 output에 data 값들을 역순으로 모두 저장하고 총 노드의 개수를 반환하는 것