반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- list
- 알고리즘
- data_structure
- '0'
- 문법
- STL
- red-black tree
- qsort
- c++
- 구현
- Biconnected_Component
- Heap
- 예제
- function_template
- sstream
- Critical_Path_Analysis
- 5397
- 백준
- template
- deletion
- Algorithm
- singly Linked List
- connected_component
- 자료구조
- Pair
- class_template
- Articulation_Point
- 총정리
- sort
- 13305
Archives
- Today
- Total
- Today
- Total
- 방명록
어제의 나보다 성장한 오늘의 나
[C++] Singly Linked List(싱글 링크드 리스트) 구현 본문
반응형
Singly Linked List란?
◎ 단일 방향으로 노드들이 연결되어 있는 STL container 중 하나이다.
◎ 데이터를 가지고 있는 연결된 노드들의 맨 앞과 맨 뒤에는 Head , Tail 이름의 노드가 있다.
◎ 노드들은 모두 next라는 노드 포인터를 가지고 있어서 다음 노드와 연결 할 수 있다.
구현
◎ Class 와 Struct를 사용하여 좀 더 깔끔한 코드를 구현하였다.
◎ Template 을 사용하여 int 뿐만 아니라 다른 Type의 자료형을 위한 Container로도 사용할 수 있다.
Coding
1) 기본 구조
template<typename T>
struct Node{
T data; // Node 속 data 저장
Node<T>* next = nullptr;
};
template<typename T>
class Singlist{
private:
Node<T>* head; // singlist의 시작. list의 data가 들어있지는 않다.
Node<T>* tail; // sinlist의 마지막. list의 data가 들어있지는 않다.
public:
Singlist() : head(new Node<T>{-1,nullptr}) , tail(new Node<T>{-1,nullptr}) {}
~Singlist() {}
2) 함수
① addNode : List 끝에 값을 push 한다.
void addNode(T new_value){
if(empty()){
head->next = new Node<T>{new_value,tail};
}
else{
Node<T>* last_node = find_last_node();
last_node->next = new Node<T>{new_value,tail};
}
}
// tail 직전 Node를 return
Node<T>* find_last_node(){
Node<T>* last = head;
if(empty()) return nullptr;
while(last->next != tail){
last = last->next;
}
return last;
}
② deleteNode : List 제일 끝의 값을 pop 한다.
void deleteNode(){
if(empty()){
cout << "deleteNode function doesn't work. list is empty." << endl;
return ;
}
else{
Node<T>* before = head;
Node<T>* del = head->next;
while(del->next != tail){
before = before -> next;
del = del -> next;
}
before -> next = tail;
}
}
③ insertNode : List에 값을 N 번째 위치에 insert한다.
void insertNode(T new_value , int N){
if(N > size()){
cout << "singlist has less datas than " << N << "." << "\n";
}
else if(N < 0){
cout << "N is negative number. please give me index number." << "\n";
}
else if(empty()){
addNode(new_value);
}
else{
Node<T>* before = head;
for(int i = 0 ; i < N ; i++){
before = before->next;
}
before->next = new Node<T>{new_value,before->next};
}
}
④ printAll : List 출력
void printAll(){
Node<T>* node = head;
if(empty()) return ;
while(node->next != tail){
node = node -> next;
cout << node->data << ' ';
}
}
⑤ size : List size 반환
int size(){
Node<T>* size = head;
int cnt = 0;
if(empty()) return cnt;
while(size->next != tail){
size = size->next;
cnt++;
}
return cnt;
}
⑥ search : List 속에 값이 있는지 없는지 확인.
bool search(T value){
Node<T>* node = head->next;
while(node != tail){
if(node->data == value) return true;
node = node->next;
}
return false;
}
⑦ getData : N 번째 노드의 값을 반환.
T getData(int N){
if(N >= size()){
return -1;
}
Node<T>* node = head;
for(int i = 0 ; i <= N ; i++){
node = node -> next;
}
return node->data;
}
반응형
'c++ > data_structure_구현' 카테고리의 다른 글
[c++][자료구조] Complete Binary Tree (완전 이진 트리) 구현 및 응용 함수들 (4) | 2022.02.21 |
---|---|
[c++][자료구조] Double Linked List(더블 링크드 리스트) 구현 / List STL (0) | 2022.02.18 |
[c++][자료구조] heap 구현 / STL / Priority Queue 총 정리 (0) | 2022.02.12 |
Queue(큐) 구현 & STL 총정리 (0) | 2022.02.10 |
Stack(스택) 구현 & Stack STL 총정리 (0) | 2022.02.09 |
Comments