728x90
728x90
우리는 간단한 linked list data 구조를 만들 것이다. 링크된 목록은 연결된 형태의 노드를 말하며, 각 노드가 다음 노드를 가리킨다.
List 클래스는 head라고 불리는 특별한 노드를 가지고 있다. 다음 헤드 노드는 목록의 첫 번째 요소를 가리킨다. 목록의 첫 번째 요소 중 다음 요소는 목록의 두 번째 요소를 가리키며, 이러한 방식으로 nullptr(0x0)이 나타날 때까지 목록을 반복하여 반복적으로 반복할 수 있다.
<list.h>
#include <string>
#include <functional>
#include "node.h"
template <typename T>
class List {
public:
List() : count(0) {
head = new Node<T>(0, nullptr);
}
~List() {
// TODO: write your code here
// release remain nodes before delete head node
while(this->head->next != nullptr)
{
pop_front();
}
delete this->head;
}
void push_front(T value) {
// TODO: write your code here
// create new node with value
// and add node to front of list
Node<T>* new_node = new Node<T>(value,this->head->next);
this->head->next = new_node;
count++;
}
void push_back(T value) {
// TODO: write your code here
// create new node with value
// and add node to back of list
if(count == 0)
{
Node<T>* new_node = new Node<T>(value,this->head->next);
this->head->next = new_node;
count++;
}
else
{
Node<T>* new_node = new Node<T>(value,nullptr);
Node<T>* last_node = this->head;
while (last_node->next != nullptr)
{
last_node = last_node->next;
}
last_node->next = new_node;
count++;
}
}
T pop_front() {
// TODO: write your code here
// remove front node(not head)
// and return its value
// if try to remove head node return 0
if(this->head->next == nullptr) return 0;
Node<T>* delete_node;
delete_node = this->head->next;
this->head->next = this->head->next->next;
count--;
return delete_node->value;
}
T pop_back() {
// TODO: write your code here
// remove back node(not head)
// and return its value
// if try to remove head node return 0
if(this->head->next == nullptr) return 0;
Node<T>* delete_node;
Node<T>* prev_delete_node= this->head;
while (prev_delete_node->next->next != nullptr)
{
prev_delete_node = prev_delete_node->next;
}
delete_node = prev_delete_node->next;
prev_delete_node->next = nullptr;
count--;
return delete_node->value;
}
size_t size() {
// TODO: write your code here
// return current items in list (except head)
return count;
}
void traverse(const std::function<void(const Node<T>&)>& f) {
for (Node<T>* node = head->next; node != nullptr; node = node->next) {
f(*node);
}
}
private:
Node<T>* head;
size_t count;
// OPTIONAL: you can write helper functions
};
<node.h>
template <typename T>
class Node {
public:
Node() {}
Node(T value) : value(value) {}
Node(T value, Node* next) : value(value), next(next) {}
T value;
Node* next;
};
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
set (CMAKE_CXX_STANDARD 11)
add_executable(main main.cc)
728x90
728x90
'Language > C++' 카테고리의 다른 글
[C++] 상속(Inheritance) - 컴도리돌이 (0) | 2020.12.27 |
---|---|
[C++] 이중 연결 리스트 (Double Linked List) - 컴도리돌이 (0) | 2020.10.28 |
[C++] Dynamic array (std::vector) - 컴도리돌이 (0) | 2020.10.26 |
[C++] Reference(&) - 컴도리돌이 (0) | 2020.10.18 |
[C++] Namespace - 컴도리돌이 (0) | 2020.10.17 |