컴공일기263
자료구조의 기본인 싱글 링크드 리스트를 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
제빵대 재학 기하 베이비 밥먹어야됨 T1벤치 질문 받습니다
-
보통 매개변수함수라함은 X=f(t) Y=g(t) 로 x와y는 t에의해 계속 변화하는...
-
인증이나 해볼까 6
-
ㅋㅋ 애송이네요 하하
-
건축공학과 1
이번에 건축공학과 진학하면 노트북을 사려는데 맥이랑 윈도우 중에 어떤 컴이 더...
-
1차 넉넉하게 붙었는데 한국사 4 이하면 탈락인지 모르고 한국사 1도 안 보고...
-
여자 키 젤 많이 본거 11
157 162 165 뭔가 얘네 셋이 많던데
-
야식메뉴추천좀 5
지금 뭐 먹으면 안되는 건 아는데 입이 심심함
-
맞팔구해요 。◕‿◕。
-
머리는 더이상복잡한사고가불가능하고몸은떨리면서 긴 풀이와지우개가루를 보면서 느끼는...
-
1. 나의 위치 2. 점수분포 에서 다른 분들은 쭉 아래까지 내리면 3. 과거 점공...
-
근데 5
드레이븐이
-
여사친이 이런말 하는데 무슨 대답을 해줘야할지
-
밥이나 먹자 4
안먹ㅇ을건데
-
오르비시작했으면 0
민트테 한 번은 달아봐야지
-
간아 버텨다오 2
이번 달만 달릴게 민짜 탈출했잖아
-
션티 프리퀀시 0
작년 단어장 봐도 상관없으려나요
-
평가원 추천 좀 9
과한거 말고하나 짐 해서 올림 잠 안 옴
-
소주로 머리아픈거면 막걸리 막걸리로 아픈거면 맥주 맥주로 아픈거면 소주
-
갑자기 빡치는군 2
에휴이
-
또 키메타야 12
오늘도 싹다 기만자들인 170 이상을 저격할때가 되었군요
-
여자고 174인데 이정도면 10퍼안에드나
-
투표나 함 받아보자 17
오늘 기하 문제 풀이를 몇 개 올려봤는데 꽤 재밌어서 수학 감 유지용으로 문제...
-
많을까요 제가 항상 밝고 그렇다는건 아닌데 보다보면 정말...뭐라 말할수 없는분들이...
-
ㅇ아아...
-
참고로 전 잉뿌삐임.
-
좋겠다
-
ㄹㅇ
-
타이레놀은 먹으면 안된다면서요
-
레어나 사가셈 1
개 많네 개 빡치네 개 화나네 화아아악
-
ㅇㅇ
-
약대랑 비교했을 때 약대가 낫나? 미래 생각했을 때 그냥 궁금해서
-
만성 비염엔 코세척이 직빵이다 첨엔 코 계속 찡하고 그럴 수도 있는데 적응하면...
-
리미트 안에서 수렴하면 리미트 밖에선 실수인데 거따가 약간 크니 약간 작으니를...
-
난 오직~ 3
그대 사랑하는 마음에~
-
125만덕
-
글 싹다 밀고프사 바꾸고닉변할꺼임또 새로운 모습으로 나타날꺼임지금의 모습을 간직해두셈
-
작성자는 올해 연대 신입학생이나 연대 문턱에 발도 못들일 시절 입장에서 최대한...
-
인스타 팔로워 한명은 556 한명은 572명이네 ㅋㅋㅋㅋㅋ 얘네 중딩인데 뭐지...
-
10분이내에 안나타날시 극한은 상쇄되는게 맞는거임
-
다들 주변에 몇없는 고능아들이던데 여기만큼은 사람답게(?) 노는걸 볼 수 있으니까 신기함
-
연대가 교차 줄인 이유가 연대 문과 = 반수학원이라 바꾼 듯 1
연대 문과 교차 풀리면서 연대 상경대, 사과대가 자퇴생 15-20% 나왔음요...
-
예전에 대학생 과외 한 번 받아본 적 있는데 지금 생각해보면 그 때 수학을 가장...
-
자기 기준에 나쁜대학 가거나 N수하게된 애들은 인증도 안하고 남들한테 말도 잘 안해서 그런거임
-
프본임뇨 2
인증 필요 없음
-
복권 투배럭 돌리면 이거 합법인가요? 복수계정은 아닌데
-
ㅎㅇㅎㅇ