컴공일기263
게시글 주소: https://app.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 답글 달기 신고
-
ㅈㄱㄴ?
-
와 존잘존예들이 모이는 이곳 내가 껴도 되는 자리 맞음?
-
극한상쇄 17
이거 걍 x ( x>=1 , x<=-1) f(x) (-1<x<1) 극한상쇄...
-
고3때까진 코피 한 번도 나본 적 없는데 재수 할 때 잇올에서 공부하다가 코피...
-
선발 조오됐네 0
한골 먹히고 교체때려서 주전들 체력 갈아버릴각 보인다 보여 반드시 잡아야 하는...
-
유툽보니까 공항에선 보안검색대만 통과하는데 3시간 걸렸다고하던데 님들은 어떻거 내려갈예정???
-
잇올 앱 8
잇올 앱으로 출결이랑 다 바뀌면 만약 잇올 안에서 카톡같은 거 켜면 바로 걸리는...
-
어떻게 저런 생각이 바로 나오지...? 창의적이라 봐야하는걸까..? 이상한 쪽으로 창의적...?
-
취르비 입갤 5
혼자 세병 먹고 등장
-
레어 확인 9
.
-
그냥 심리적으로 그럼근데 여기서 상대가 맞팔로우 안한다? 그럼 바로 무한 우울 스택 쌓이는거임
-
부럽다....
-
과외하는데 숙제 0
애가 숙제 하루 안했고 월요일에 과외있는데 이날 한번 더 안하면 부모님한테...
-
여르비 ㅇㅈ 11
...
-
재수 고민 2
지방일반고 2점후반대에 인서울 힘든 성적이라 정시공부 빡세게 했고 이번에 중대...
-
맛있는 문제 좀 올려주세요 오네가이시마스.
-
꾸준글 쓰다보면 0
목표를 향한 마음도 재정립되고 좋음
-
에휴..
-
진심으로,,
-
원래 청순한여자가 그렇지 않은 법이야.
-
아니 화작 원래 스무스하게 다 풀고 넘어가는데 2문제가 답이안보여서 멘탈...
-
오래된 노래가 4
진짜 오래된 노래가 돼버렸네요
-
트페랑 같이 쓰니까 아직 쓸만한데
-
추합 인원 0
18명 뽑는과 9번까지 안오려나 ㅠㅠ 작년에 11번까지 돌긴했는데
-
하, 기하.. 3
ㅜㅜㅜㅜㅜㅜㅜ
-
눈만 ㅇㅈ. 73
사유: 이것 어울리나요?
-
적셔~ 2
-
그런 의미가 있죠~ ㅜㅜ눈물이 다 납니다
-
06년생이고 올수 23111 받아서 중경외시라인 높은과 정도 갑니다 (문과)경희경영...
-
근데 애프터는 안 잡힘
-
두렵다 2
이분도 은둔 덕코 부자세요
-
해보신 분 있음? 어케하지?
-
물1에서 생2 6
런 괜찮음? 공부량 많이 잡아먹음? 1컷만 받으면 되간함(최저러) 물1은 내신때...
-
김범”JUN OR NOT”
-
근데 아닐듯 진짜 사람 일 모른다...
-
허전해서 봤는데 팔렸ㄴ0ㅔ
-
나보다 덕코도 낮은 바.보.들~♥︎
-
질문받습니다 9
아무거나 ㄱㄱ
-
짭조름한게 맛있기도해. 에드워드리가 흑백요리사에서 코딱지요리했으면 우승임 ㅇㅇ
-
극한의 탐잘인데.. 원래 서성한 두장쓸라다가 변표보고 열받아서 고대 지르고...
-
누군 인스타 팔로우 만명에 외모도 지림 근데 또 누군 올라온 글에서 느꼈다던 것처럼...
-
지금 이 문제에서 ㄷ선지만 설명해보자면 ㄷ선지의 맥락을 좀 보면 최솟값이 있나고를...
-
Chill - 3 수를 할 guy
-
좀 더 깊은 개념으로 들어가면 개념들간의 유기적인 관계가 그냥 성관계임
-
닉변기념 좋아하는 오르비언들에게 팔로우 난사하기. 16
맞팔해줘