template <typename T>
LinkedList<T>::LinkedList()
{
m_nLength = 0;
m_pList = NULL;
m_pCurPointer = NULL;
}
// Class destructor
template <typename T>
LinkedList<T>::~LinkedList()
{
MakeEmpty();
}
template <typename T>
void LinkedList<T>::MakeEmpty()
{
NodeType<T>* tempPtr;
while (m_pList != NULL)
{
tempPtr = m_pList;
m_pList = m_pList->next;
delete tempPtr;
}
m_nLength = 0;
}
template <typename T>
int LinkedList<T>::GetLength() const
{
return m_nLength;
}
template <typename T>
int LinkedList<T>::Add(T item)
{
ResetList();
NodeType<T> *node = new NodeType<T>;
NodeType<T> *pre;
T dummy;
bool bFound = false;
node->data = item;
node->next = NULL;
if (!m_nLength)
{
m_pList = node;
}
// list 에 node 가 하나 이상 존재하는 경우
else
{
// 가장 마지막 node 로 이동 후 삽입
while (1)
{
// 이전 노드를 가리키는 포인터 갱신
pre = m_pCurPointer;
// iteration 을 이용해 node 포인터 갱신.
GetNextItem(dummy);
if (m_pCurPointer->data>node->data)
{
if (pre == NULL)
{
node->next = m_pCurPointer;
m_pList = node;
break;
} //넣을 자리 앞 원소가 존재하지 않을 때 첫번째 원소로 삽입.
node->next = m_pCurPointer;
pre->next = node;
break;
} //지금 가리키는 원소의 data값이 node의 data값보다 클 경우 pre 뒷자리에 삽입.
// node 포인터가 마지막 node 를 가리키면 그 뒤에 새로운 node 삽입.
if (m_pCurPointer->next == NULL)
{
// 마지막 node 와 새로운 node 연결
m_pCurPointer->next = node;
break;
}
}
}
m_nLength++;
return 1;
}
template <typename T>
int LinkedList<T>::Get(T& item)
{
bool moreToSearch, found;
NodeType<T>* location; //변수 선언
location = m_pList;
found = false;
moreToSearch = (location != NULL); //변수 초기화
while (moreToSearch && !found) //리스트의 끝이 아니면서 아직 찾지 않았으면 반복한다.
{
if (item == location->data)
{
found = true;
item = location->data;
} //일치하는 항목을 찾았을 때 found의 값을 변경해주고 item에 해당 항목을 복사해준다.
else
{
location = location->next;
moreToSearch = (location != NULL);
} //찾지 못했을 때 다음 항목으로 location을 옮기고 그 값이 NULL이면 리스트의 끝이므로 moreToSearch의 값을 변경해준다.
}
if (found)
return 1;
else
return 0; //찾으면 1, 그렇지 못하면 0을 리턴한다.
}
// Initializes current pointer for an iteration through the list.
template <typename T>
void LinkedList<T>::ResetList()
{
// current pointer 초기화
m_pCurPointer = NULL;
}
// Gets the next element in list.
template <typename T>
void LinkedList<T>::GetNextItem(T& item)
{
// current pointer 이 NULL이라면 처음 node를 가리킴.
if (m_pCurPointer == NULL)
{
m_pCurPointer = m_pList;
}
else
//current position 을 다음 노드로 이동
m_pCurPointer = m_pCurPointer->next;
//item 에 current position 의 info 를 삽입
item = m_pCurPointer->data;
}
template <typename T>
T* LinkedList<T>::GetPoint(T data)
{
bool moreToSearch, found;
NodeType<T>* location; //변수 선언
location = m_pList;
found = false;
moreToSearch = (location != NULL); //변수 초기화
while (moreToSearch && !found) //리스트의 끝이 아니면서 아직 찾지 않았으면 반복한다.
{
if (data == location->data)
{
found = true;
data = location->data;
return &location->data;
} //일치하는 항목을 찾았을 때 found의 값을 변경해주고 item에 해당 항목을 복사해준다.
else
{
location = location->next;
moreToSearch = (location != NULL);
} //찾지 못했을 때 다음 항목으로 location을 옮기고 그 값이 NULL이면 리스트의 끝이므로 moreToSearch의 값을 변경해준다.
}
return NULL; //찾지 못하면 0을 리턴한다.
}