#include<iostream>
struct Node
{
int value;//데이터형은 상황에 따라 바뀔 수 있음
struct Node * next;
};
class LinkedList{
public:
LinkedList()//빈 생성자
{
this->m_head = nullptr;
this->m_tail = nullptr;
this->m_size = 0;
}
LinkedList(const LinkedList & ref)//복사 생성자
{
Node * iter = ref.m_head;
Node ** now = &this->m_head;
while (iter != nullptr)
{
Node* newNode = new Node;
newNode->value = iter->value;
newNode->next = nullptr;
*now = newNode;
if (iter->next == nullptr)
{
this->m_tail = *now;
}
now = &newNode->next;
iter = iter->next;
}
this->m_size = ref.m_size;
}
LinkedList(LinkedList && moveRef)//이동 생성자
{
this->m_size = moveRef.m_size;
this->m_head = moveRef.m_head;
this->m_tail = moveRef.m_tail;
moveRef.m_head = nullptr;
moveRef.m_size = 0;
}
~LinkedList()//소멸자
{
if (this->m_head != nullptr)
{
if (this->m_size != 0)
{
Node * iter = this->m_head;
while (iter != nullptr)
{
Node * nextIter = iter->next;
delete iter;
iter = nextIter;
}
}
}
}
bool Insert(unsigned int index, int value)//넣는 순번은 음수일 수 가 없으므로 부호없는 형으로 선언한다.
{
unsigned int i = 0;
Node * iter = this->m_head;
if (index < this->m_size)
{
while (iter != nullptr)
{
if (i == index)
{
Node * newNode = new Node;
newNode->value = value;
newNode->next = iter->next;
iter->next = newNode;
if (newNode == nullptr)
{
this->m_tail = newNode;
}
this->m_size++;
return true;
}
iter = iter->next;
i++;
}
}
return false;
}
void Append(int value)
{
Node * newNode = new Node;
newNode->next = nullptr;
newNode->value = value;
if (this->m_tail != nullptr)
{
this->m_tail->next = newNode;
this->m_tail = newNode;
}
else
{
this->m_head = newNode;
this->m_tail = newNode;
}
this->m_size++;
}
bool Remove(unsigned int index)
{
if (index < this->m_size)
{
unsigned int i = 0;
Node * iter = this->m_head;
Node * preIter = nullptr;
while (iter != nullptr)
{
if (i == index)
{
Node * oldNode = iter;
if (preIter != nullptr)
{
if (iter == this->m_tail)
{
this->m_tail = preIter;
}
preIter->next = iter->next;
}
else
{
if (m_size == 1)
{
this->m_tail = nullptr;
}
m_head = iter->next;
}
delete oldNode;
m_size--;
return true;
}
i++;
preIter = iter;
iter = iter->next;
}
}
return false;
}
bool Get(unsigned int index, int * pReturn)
{
if (pReturn != nullptr)
{
if (index < this->m_size)
{
Node * iter = this->m_head;
unsigned int i = 0;
while (iter != nullptr)
{
if (i == index)
{
*pReturn = iter->value;
return true;
}
iter = iter->next;
i++;
}
}
}
return false;
}
unsigned int Size()
{
return this->m_size;
}
private:
struct Node * m_head;
struct Node * m_tail;
unsigned int m_size;
};
int main()
{
LinkedList list;
list.Append(5);
list.Append(4);
list.Append(3);
list.Append(2);
list.Append(1);
LinkedList list2 = list;
for (int i = 0; i < list2.Size(); i++)
{
int num = 0;
if (list2.Get((unsigned int)i, &num))
{
std::cout << num << ",";
}
}
system("pause");
return 0;
}