컴공일기263
게시글 주소: https://iu.orbi.kr/00071243744
자료구조의 기본인 싱글 링크드 리스트를 C++ 버전으로 간단히 구현한 예제입니다.
OOP답게 노드, 링크드 리스트, 이터레이터의 클래스가 정의되고
각각의 객체가 가져야 하는 기능을 구현한 것이지요.
사실, 핵심에 초점을 맞추어 구현했기 때문에
상용화를 시키기엔 “매우 매우” 무리가 있습니다.
당장, 리스트의 중간에 삽입하는 로직도 없고
무엇보다 더미헤드를 가지지 않은 상황이라 비효율적이고
딥 카피 기반의 복사 생성도 지원하지 않지요.
또 충격적인 건, 이미 STL에서 forward_list를 지원하고 있습니다.
이 코드보다 훨씬 더 정교하고, 신뢰성있고, 효율적인 라이브러리를 이미 C++에서는 지원하고 있죠.
즉, C++에서 구현해 놓은 좋은 라이브러리를 가져다 쓰면 될 일입니다.
그러면 왜 이런 코드를 짠 걸까.
간단합니다. STL은 저와 같은 “사용자” 입장에서 구현과 상세가 감추어졌습니다.
따라서, 제 입장에선 STL 리스트의 전반적 구조를 모릅니다. 그런데 말입니다.
“잘 가져다 쓴다는 건”, 내부적인 상황을 어느정도는 알 때 가능한 일입니다.
이 라이브러리가 어떤 구조를 갖고 있는지를 아예 모르는 상태라면, 자칫 이 라이브러리 구조에서
절대 하면 안 될 짓거리들을 하기 마련이죠. 라이브러리를 잘 쓰려면, 우선 하지 말아야 할 걸 알아야 하고
이 말은 결국… 어느 정도의 구조는 알고 있어야 된다는 걸 의미하죠.
따라서, 완벽하고 확실하게는 아니어도 이런 방식으로 흉내내면서 전체적인 구조를 파악할 필요가 있습니다.
OOP에서는 구조가 너무나도 중요한 핵심이니까요. 구조에 따라서, 해야 할 짓과 안 해야 할 짓이 나뉩니다.
안해야 할 짓을 해야 할 짓으로 착각하고 이용한다면?
야근 시간이 길어지겠죠?
#include <iostream>
using namespace std;
class Node
{
public:
explicit Node(int value) : data(value), next(nullptr) {};
//getter
Node* getNext() const
{
return next;
}
int& getData()
{
return data;
}
//setter
void setNext(Node* nextNode)
{
next = nextNode;
}
void setData(int value)
{
data = value;
}
private:
int data;
Node* next = nullptr;
};
class Linked_List
{
public:
Linked_List() : head(nullptr) {};
~Linked_List()
{
Node* tmp = head;
while(tmp != nullptr)
{
Node* pDelete = tmp;
cout << "delete " << pDelete->getData() << endl;
tmp = tmp->getNext();
delete pDelete;
}
}
void insertAtHead(int value)
{
Node* newNode = new Node(value);
if(head == nullptr)
{
head = newNode;
}
else
{
newNode->setNext(head);
head = newNode;
}
}
void remove(int value)
{
//헤드 노드를 삭제하는 경우
if(head->getData() == value)
{
Node* pDelete = head;
head = pDelete->getNext();
delete pDelete;
return;
}
//헤드가 아닌 노드를 삭제하는 경우
Node* pDelete = head->getNext();
Node* pPrevious = head;
while(pDelete->getData() != value)
{
pDelete = pDelete->getNext();
pPrevious = pPrevious->getNext();
}
pPrevious->setNext(pDelete->getNext());
delete pDelete;
}
void getList()
{
Node* tmp = head;
while(tmp != nullptr)
{
cout << tmp->getData() << " ";
tmp = tmp->getNext();
}
cout << endl;
}
class Iterator
{
public:
explicit Iterator(Node* Node) : current(Node) {}
int& operator*() const
{
return current->getData();
}
Iterator& operator++()
{
if(current) current = current->getNext();
return *this;
}
bool operator!=(const Iterator& other)
{
return current != other.current;
}
private:
Node* current;
};
Iterator begin()
{
return Iterator(head);
}
Iterator end()
{
return Iterator(nullptr);
}
private:
Node* head;
};
int main()
{
Linked_List list;
list.insertAtHead(1);
list.insertAtHead(2);
list.insertAtHead(3);
list.insertAtHead(4);
Linked_List::Iterator it = list.begin();
for(auto it = list.begin(); it != list.end(); ++it)
{
*it *= 3;
}
list.getList();
}
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
반가워요 새해복 많이 받으세여좋아요 0 답글 달기 신고
-
진짜 어케함..? 실수분들만의 전략같은게 있나요
-
작수 86점이고 계속 2등급 중반 받음 (쉬우면 1) 영어 완전 안정1 받고싶은디...
-
시발점 회독 2
가볍게 개념이나 틀린문제 흝어보는건지 아니면 완강하고 처음부터 다시하는건지...
-
수능점수가 어느정도인거임?
-
3,4에서 1,2로 올리신 분들 계시다면 댓글로 이유까지 알려주시면 감사하겠습니다!
-
기출 + 기출변형 합해서 수1수2선택 2000문제 인데 3권합해서 6만원이면...
-
세지 지엽 6
세지 지엽은 이기상 개념교재랑 수특수완만 싹 외우면 대비 가능한 정도임? 아님 그...
-
합격했는데 지금 알수없죠?
-
[A],[B]나 (가),(나, 이런거 써져있으면 지문 읽다가 선지질문으로 가서...
-
강기본 고전시가 인강 듣고 있는데 그냥 책으로만 공부하면 안좋을까요..
-
강북청솔 1
이번에 삼수하는 05년생입니다...! 강북청솔을 가려고 해서 여쭤보고 싶은 게...
-
재수생이라 시간이 많기는 한데 미적 4틀입니다.. 공통도 안되어있긴 한데 확통하는게...
-
그릿 피램 0
피램으로 기출 공부했는데 그릿은 답지가 형식이 좀 달라서 처음이라 분석 어떻게...
-
선호도가 한의대<약대//공대<상경이면 죽어도 사탐런인가요? 2
물론 성적 꼬라지를 보면 그렇게 뜰지도 의문이지만 수능 대박나서 한의대 성적이 떠도...
-
일단 1시단 넘게 풀집중 해본건 모고때 밖에 없음 국어 : 한지문 풀고 멍때림...
-
수학 현역 질문 6
수12 미적 까먹은 거 개개개개많고 할 것도 개개개개 많은데 못함. 또 고3모는...
-
모고보면 낮1~높3 왔다갔다 하는데 고1,2 모고 기준 문학은 다맞거나 많이 틀려도...
-
재수 감찾는법 1
하도 놀았더니 다잊어버렸는데 다시 감잡으려면 뭐부터 해야할지 추천해주세요 재수해보신분들 ㅜ
-
평가원 90점 이상은 뜨는데 실전개념 제대로 해본적 없고 스킬들 많이 주워들어서...
-
쎈- 시발점? 0
쎈b 한단원에 네다섯 문제 정도 빼고 수월하게 푸는데 시발점을 해야 할까요..?...
-
1. 스키마를 체화했다는 게 머릿속에서 지문 읽을 때 구조가 그려지는 건가요? 2....
-
강기분 0
25강기분이랑 26강기분 큰 차이 있음? 작년꺼 들어도 됨?
-
함수의 극한이고 다른 거 없이 극한만으로 킬러였는데 절댓값이 있었던 것 같아요 너무...
-
확통 이과 3
선택과목 확통 화작 화학 생명 할려고 하는데 이렇게 해서 약대나 화학공학과, 화생공...
-
물리2는 개념을 정확히 알면 문제는 잘 풀리는 과목인가요??? 3
어떻게 생각하시나요??? 개념공부로 너무 힘빼는건 안좋을까요???
-
수1 수2 둘 다 들으려고 하고 개념 꼼꼼히 설명해주는 강사보다 팁 주고 강의 수...
-
내일 아침에 해도 되나 지문 어랴워서 2시간은 걸릴 거 같은데
-
국어 기출분석 1
검더텅을 샀는데 독서는 174지문있고 문학은 284작품정도 있다는데 일클.연필통도...
-
고2 9모까진 1 잘 나오다가 10모때 81쳐맞고... 고3거 보니까 대충 감으로...
-
사탐런 제발요 3
국수영에 시간투자+과탐 고인물 사이에서 못살아남을듯 이런 이유로 재수 사탐런을 함...
-
이해원 S1을 안정감있게 풀수있는 실력 정도 됨 킬링캠프 풀어보면 80점정도 나옴...
-
건축학과 3
건축학과 희망하는 07인데요 내신으론 화생미적했었는데 정시로 돌릴생각이거든오 내년에...
-
국일만 사려고하는데, 위에 이미지중에 뭐 사야되나요?? 뭐,, 국정원으로...
-
일반고 예비고2고 2학년때 수1 수2 확통 내신으로 다 해야하는데 현재 개정전...
-
내신 물화지 하다 넘어와서 싹 다 노베입니다 ㅠ 생윤: 의미있는건진 모르겠지만...
-
고2 내신 뉴런 2
뉴런이랑 문제집 양치기중에 뭐가더 내신따기 좋나요?
-
이번주 계획표 보니까 문학만 있던데 이번주 독서는 엮어읽기 안해도되는건가요?
-
국어공부 방향성 3
(커뮤에 글을 많이 안써봐서 읽기 힘들수도있음 양해좀..) 현재 김승리 올오카...
-
한종철 홍준용 3
철두철미 개념 mdgc 끝내고 홍준용 T&S 이후 커리 타면 되나요? 아님...
-
알피엠, 김기현 킥오프 풀고 ㅏ플시너지까지 푸는 건 오바? 고3 현역임
-
마플 삼도극 너무 어려운데 근사 써서 푸는걸 연습할까요? 5
예비고3 미적분 마플교과서로 학원에서 처음으로 배우고 있는데 삼도극 유형이 문제가...
-
비문학 노베이슨데 이 두개 중에 뭐 사야하는건가요???
-
고3인데 유형문제집으로 마플시너지 비추인가요? 그냥 알피엠이랑 김기현 킥오프만 하고...
-
지문읽을때 3에서4분 정도 걸리는데 읽는시간에 더 써야되나? 6 7분 이렇게 읽으면...
-
김동욱 언매 체크메이트 들었는데 다음으로 본바탕 들으면 되나요? 그 다음으로 뭐...
-
신택스 끝내고 2
뭐해야할까요?ㅜㅜ 마더텅 같은거 해야하나여
-
문학 황님들. 0
문학 맨날 3~4개 틀리는데 공부 어떻ㄱ ㅔ 해야하나요...?
-
로그지수함수 파트는 진짜 어려운 문제도 웬만하면 다 풀리기라도 했었는데 삼각함수...
-
수1 선행 5
님들 수1 이번 방학에 삼각함수까지 나가는게 맞나요? 아니면 수열까지 나가는게...