컴공일기263
게시글 주소: https://io.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 답글 달기 신고
-
또 키메타야 12
오늘도 싹다 기만자들인 170 이상을 저격할때가 되었군요
-
여자고 174인데 이정도면 10퍼안에드나
-
투표나 함 받아보자 17
오늘 기하 문제 풀이를 몇 개 올려봤는데 꽤 재밌어서 수학 감 유지용으로 문제...
-
많을까요 제가 항상 밝고 그렇다는건 아닌데 보다보면 정말...뭐라 말할수 없는분들이...
-
ㅇ아아...
-
참고로 전 잉뿌삐임.
-
좋겠다
-
ㄹㅇ
-
타이레놀은 먹으면 안된다면서요
-
레어나 사가셈 1
개 많네 개 빡치네 개 화나네 화아아악
-
ㅇㅇ
-
약대랑 비교했을 때 약대가 낫나? 미래 생각했을 때 그냥 궁금해서
-
만성 비염엔 코세척이 직빵이다 첨엔 코 계속 찡하고 그럴 수도 있는데 적응하면...
-
리미트 안에서 수렴하면 리미트 밖에선 실수인데 거따가 약간 크니 약간 작으니를...
-
난 오직~ 3
그대 사랑하는 마음에~
-
125만덕
-
글 싹다 밀고프사 바꾸고닉변할꺼임또 새로운 모습으로 나타날꺼임지금의 모습을 간직해두셈
-
작성자는 올해 연대 신입학생이나 연대 문턱에 발도 못들일 시절 입장에서 최대한...
-
인스타 팔로워 한명은 556 한명은 572명이네 ㅋㅋㅋㅋㅋ 얘네 중딩인데 뭐지...
-
10분이내에 안나타날시 극한은 상쇄되는게 맞는거임
-
다들 주변에 몇없는 고능아들이던데 여기만큼은 사람답게(?) 노는걸 볼 수 있으니까 신기함
-
연대가 교차 줄인 이유가 연대 문과 = 반수학원이라 바꾼 듯 1
연대 문과 교차 풀리면서 연대 상경대, 사과대가 자퇴생 15-20% 나왔음요...
-
예전에 대학생 과외 한 번 받아본 적 있는데 지금 생각해보면 그 때 수학을 가장...
-
자기 기준에 나쁜대학 가거나 N수하게된 애들은 인증도 안하고 남들한테 말도 잘 안해서 그런거임
-
프본임뇨 2
인증 필요 없음
-
복권 투배럭 돌리면 이거 합법인가요? 복수계정은 아닌데
-
ㅎㅇㅎㅇ
-
쓸데없이 마침표 쓰기?
-
극한상쇄 궁극적인 어둠의 스킬임
-
ㅈㄱㄴ?
-
와 존잘존예들이 모이는 이곳 내가 껴도 되는 자리 맞음?
-
극한상쇄 17
이거 걍 x ( x>=1 , x<=-1) f(x) (-1<x<1) 극한상쇄...
-
고3때까진 코피 한 번도 나본 적 없는데 재수 할 때 잇올에서 공부하다가 코피...
-
선발 조오됐네 0
한골 먹히고 교체때려서 주전들 체력 갈아버릴각 보인다 보여 반드시 잡아야 하는...
-
유툽보니까 공항에선 보안검색대만 통과하는데 3시간 걸렸다고하던데 님들은 어떻거 내려갈예정???
-
잇올 앱 8
잇올 앱으로 출결이랑 다 바뀌면 만약 잇올 안에서 카톡같은 거 켜면 바로 걸리는...
-
어떻게 저런 생각이 바로 나오지...? 창의적이라 봐야하는걸까..? 이상한 쪽으로 창의적...?
-
취르비 입갤 5
혼자 세병 먹고 등장
-
레어 확인 9
.
-
그냥 심리적으로 그럼근데 여기서 상대가 맞팔로우 안한다? 그럼 바로 무한 우울 스택 쌓이는거임
-
부럽다....
-
과외하는데 숙제 0
애가 숙제 하루 안했고 월요일에 과외있는데 이날 한번 더 안하면 부모님한테...
-
여르비 ㅇㅈ 11
...
-
재수 고민 2
지방일반고 2점후반대에 인서울 힘든 성적이라 정시공부 빡세게 했고 이번에 중대...
-
맛있는 문제 좀 올려주세요 오네가이시마스.
-
꾸준글 쓰다보면 0
목표를 향한 마음도 재정립되고 좋음
-
에휴..
-
진심으로,,