template <class T>
class Node
{
private:
T data;
Node<T>* pnext;
public:
Node();
Node(T);
T getData() { return this->data; }
void setData(T n) { this->data = n; }
singlenode<T>* getNext() { return this->pnext; }
void setNext(singlenode<T>* pnode) { this->pnext = pnode; }
};
template <class T>
Node<T>::Node()
{
this->data = 0;
this->pnext = NULL;
}
template <class T>
Node<T>::Node(T n)
{
this->data = n;
this->pnext = NULL;
}
template <class T>
class SingleLinkedList
{
private:
Node<T>* phead;
Node<T>* ptail;
int ssize;
public:
SingleLinkedList();
bool isEmpty() { return this->phead == NULL ? true : false; }
int size() { return this->ssize; }
Node<T>* getHead() { return this->phead; }
T getData(int);
void AddFront(T);
void AddBack(T);
void InsertNode(Node<T>*, T);
void DeleteNode(int);
};
멤버 함수 상세 내용
getData(int n) : phead부터 n번째 data를 리턴한다.
template <class T>
T SingleLinkedList<T>::getValue(int n)
{
Node<T>* tmp = this->phead;
for (int i = 0; i < n; i++)
{
tmp = tmp->getNext();
}
return tmp->getData();
}
template <class T>
void SingleLinkedList<T>::AddFront(T n)
{
Node<T>* tmp = new Node<T>(n);
this->ssize++;
if (this->phead == NULL)
{
this->phead = tmp;
this->ptail = tmp;
}
else
{
tmp->setNext(this->phead);
this->phead = tmp;
}
template <class T>
void SingleLinkedList<T>::AddBack(T n)
{
Node<T>* tmp = new Node<T>(n);
this->ssize++;
if (this->phead == NULL)
{
this->phead = tmp;
this->ptail = tmp;
}
else
{
this->ptail->setNext(tmp);
this->ptail = tmp;
}
}
template <class T>
void SingleLinkedList<T>::InsertNode(Node<T>* previous, T n)
{
Node<T>* tmp = new Node<T>(n);
this->ssize++;
tmp->setNext(previous->getNext());
previous->setNext(tmp);
}
template <class T>
void SingleLinkedList<T>::DeleteNode(int n)
{
if (ssize != 0 && n < ssize)
{
this->ssize--;
if (n == 0)
{
this->phead = this->phead->getNext();
}
else
{
Node<T>* previous = this->phead;
Node<T>* tmp = previous->getNext();
for (int i = 1; i < n; i++)
{
previous = tmp;
tmp = previous->getNext();
}
if (n == ssize)
{
this->ptail = previous;
previous->setNext(NULL);
}
previous->setNext(tmp->getNext());
}
if (ssize == 0)
{
this->phead = NULL;
this->ptail = NULL;
}
}
}
#include <iostream>
using namespace std;
template <class T>
class Node
{
private:
T data;
Node<T>* pnext;
public:
Node();
Node(T);
T getData() { return this->data; }
void setData(T n) { this->data = n; }
Node<T>* getNext() { return this->pnext; }
void setNext(Node<T>* pnode) { this->pnext = pnode; }
};
template <class T>
Node<T>::Node()
{
this->data = 0;
this->pnext = NULL;
}
template <class T>
Node<T>::Node(T n)
{
this->data = n;
this->pnext = NULL;
}
template <class T>
class SingleLinkedList
{
private:
Node<T>* phead;
Node<T>* ptail;
int ssize;
public:
SingleLinkedList();
bool isEmpty() { return this->phead == NULL ? true : false; }
int size() { return this->ssize; }
Node<T>* getHead() { return this->phead; }
T getData(int);
void AddFront(T);
void AddBack(T);
void InsertNode(Node<T>*, T);
void DeleteNode(int);
};
template <class T>
SingleLinkedList<T>::SingleLinkedList()
{
this->phead = NULL;
this->ptail = NULL;
this->ssize = 0;
}
template <class T>
void SingleLinkedList<T>::AddFront(T n)
{
Node<T>* tmp = new Node<T>(n);
this->ssize++;
if (this->phead == NULL)
{
this->phead = tmp;
this->ptail = tmp;
}
else
{
tmp->setNext(this->phead);
this->phead = tmp;
}
}
template <class T>
void SingleLinkedList<T>::AddBack(T n)
{
Node<T>* tmp = new Node<T>(n);
this->ssize++;
if (this->phead == NULL)
{
this->phead = tmp;
this->ptail = tmp;
}
else
{
this->ptail->setNext(tmp);
this->ptail = tmp;
}
}
template <class T>
void SingleLinkedList<T>::InsertNode(Node<T>* previous, T n)
{
Node<T>* tmp = new Node<T>(n);
this->ssize++;
tmp->setNext(previous->getNext());
previous->setNext(tmp);
}
template <class T>
void SingleLinkedList<T>::DeleteNode(int n)
{
if (ssize != 0 && n < ssize)
{
this->ssize--;
if (n == 0)
{
this->phead = this->phead->getNext();
}
else
{
Node<T>* previous = this->phead;
Node<T>* tmp = previous->getNext();
for (int i = 1; i < n; i++)
{
previous = tmp;
tmp = previous->getNext();
}
if (n == ssize)
{
this->ptail = previous;
previous->setNext(NULL);
}
previous->setNext(tmp->getNext());
}
if (ssize == 0)
{
this->phead = NULL;
this->ptail = NULL;
}
}
}
template <class T>
T SingleLinkedList<T>::getData(int n)
{
Node* tmp = this->phead;
for (int i = 0; i < n; i++)
{
tmp = tmp->getNext();
}
return tmp->getData();
}
int main()
{
SingleLinkedList<int>* sli = new SingleLinkedList<int>();
sli->AddBack(2);
sli->AddBack(3);
sli->AddBack(9);
sli->AddBack(10);
sli->AddFront(4);
sli->AddFront(5);
sli->AddFront(6);
sli->AddFront(7);
sli->AddFront(8);
cout << "2, 3, 9, 10을 앞에 추가하고, 4, 5, 6, 7, 8을 뒤에 추가한 결과 :";
Node<int>* tmp = sli->getHead();
for (int i = 0; i < sli->size(); i++)
{
cout << ' ' << tmp->getData();
tmp = tmp->getNext();
}
cout << '\n';
Node<int>* ptr = sli->getHead();
ptr = ptr->getNext()->getNext();
cout << "앞에서 3번째 인덱스 뒤에 150을 추가한다\n";
sli->InsertNode(ptr, 150);
cout << "5번째 인덱스 뒤의 노드를 삭제한다\n";
sli->DeleteNode(5);
cout << "최종 리스트 :";
tmp = sli->getHead();
for (int i = 0; i < sli->size(); i++)
{
cout << ' ' << tmp->getData();
tmp = tmp->getNext();
}
cout << '\n';
}
2, 3, 9, 10을 앞에 추가하고, 4, 5, 6, 7, 8을 뒤에 추가한 결과 : 8 7 6 5 4 2 3 9 10
앞에서 3번째 인덱스 뒤에 150을 추가한다
5번째 인덱스 뒤의 노드를 삭제한다
최종 리스트 : 8 7 6 150 5 2 3 9 10