반응형
※ 무엇인가
기존의 Linked List의 노드에 앞의 노드의 주소를 저장하는 포인터 변수가 추가 되었다.
그로 하여금, 앞 뒤 모든 방향으로 전체 무한 순환이 가능하다.
O(N) = N
O(N) => 최악의 상황에서 입력 대비 얼마나 걸리는지 나타냄(상수는 무시 ex log2N 에서 2)
<DLinkedList.h>
#pragma once
#include <iostream>
using namespace std;
typedef int DataType;
struct Node
{
DataType Data;
Node* PrevNode;
Node* NextNode;
};
Node* Create(DataType data);
void Destroy(Node** node);
void Push(Node** head, Node* node);
void insert(Node* current, Node* node);
void insertHead(Node** current, Node* head);
void Remove(Node** head, Node* remove);
Node* GetNode(Node* head, int location);
int GetNodeCount(Node* head);
<DLinkedList.cpp>
#include <iostream>
#include "DLinkedList.h"
using namespace std;
/*
최적화 잘된 코드: 컴파일러가 실행하기 쉬운코드 >> 유지보수 ㅈㄴ 힘들어짐
중단점에 조건식 걸 수 있음
*/
Node* Create(DataType data)
{
Node* node = new Node();
node->Data = data;
node->PrevNode = NULL;
node->NextNode = NULL;
return node;
}
void Destroy(Node** node)
{
delete *node;
*node = NULL;
}
void Push(Node** head, Node* node)
{
if ((*head) != NULL)
{
Node* tail = (*head);
while (tail->NextNode != NULL)
tail = tail->NextNode;
tail->NextNode = node;
node->PrevNode = tail;
}
else
{
*head = new Node();
}
}
void insert(Node * current, Node * node)
{
node->NextNode = current->NextNode;
node->PrevNode = current;
if (current->NextNode != NULL)
current->NextNode->PrevNode = node;
current->NextNode = node;
}
void insertHead(Node ** current, Node * head)
{
if (current == NULL) {
*current = head;
}
else
{
head->NextNode = *current;
*current = head;
}
}
Node * GetNode(Node * head, int index)
{
Node* current = head;
while (current != NULL && (--index >= 0))
{
current = current->NextNode;
}
return current;
}
int GetNodeCount(Node * head)
{
int count = 0;
Node* current = head;
while (current != NULL)
{
current = current->NextNode;
count++;
}
return count;
}
void Remove(Node ** head, Node * remove)
{
if (*head == remove)
{
*head = remove->NextNode;
if (*head != NULL)
(*head)->PrevNode = NULL;
remove->PrevNode = NULL;
remove->NextNode = NULL;
}
else
{
Node* current = *head;
remove->PrevNode->NextNode = current->NextNode;
if (remove->NextNode != NULL)
remove->NextNode->PrevNode = current->PrevNode;
remove->PrevNode = NULL;
remove->NextNode = NULL;
}
}
<Main.cpp>
#include <iostream>
#include "DLinkedList.h"
using namespace std;
int main()
{
Node* node = NULL;
for (int i = 0; i < 5; i++)
{
Node* temp = Create(i);
Push(&node, temp);
}
//시작부분에 삽입
Node* newNode = NULL;
{
newNode = Create(-1);
insertHead(&node, newNode);
newNode = Create(-2);
insertHead(&node, newNode);
}
int a = 0;
//Print
{
Node* current = GetNode(node, 2);
newNode = Create(1000);
insert(current, newNode);
int count = GetNodeCount(node);
for (int i = 0; i < count; i++)
{
Node* current = GetNode(node, i);
cout << "List[" << i << "} :" << current->Data << endl;
}
cout << "-----------------------------------" << endl << endl;
}
//Remove
{
Node* remove = GetNode(node, 3);
Remove(&node, remove);
int count = GetNodeCount(node);
for (int i = 0; i < count; i++)
{
Node* current = GetNode(node, i);
cout << "List[" << i << "} :" << current->Data << endl;
}
cout << "-----------------------------------" << endl << endl;
}
//Remove All
{
int count = GetNodeCount(node);
for (int i = 0; i < count; i++)
{
Node* current = GetNode(node, 0);
if (current != NULL)
{
Remove(&node, current);
Destroy(¤t);
int a = 0;
}
}
int a = 0;
}
return 0;
}
반응형
'프로그래밍' 카테고리의 다른 글
[C++] Queue (0) | 2021.02.17 |
---|---|
[C++] Stack (0) | 2021.02.16 |
[C++] LinkedList (0) | 2021.02.15 |
[C++] 템플릿 (0) | 2021.02.15 |
DirectX 2D 포트폴리오(네크로댄서) (0) | 2021.01.28 |