컴공일기263
게시글 주소: https://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를 선물하세요.
-
단어라고 생각함 4.9프로는 유형별 공략? 접근법 0.1프로는 듣기
-
개수세기 없는 나형 시험지 풀면 됨
-
y=e^x에서 x, y a배씩 하면 y=(e^ax)/a인데 마지막 1/a는...
-
다들 굿밤 2
(한동안휴릅해뇨)
-
나이 ㅈㄴ 쳐먹으면 그 나이에서 동안이어봤자 그래도 많음
-
열심히 한다고 저정도 수준에 도달할까 진짜 대단하네 저렇게 되고 싶다 그럼...
-
Disclaimer: 답을 주는 글이 아닙니다. 얼마 전에 이 질문을 하신 분을...
-
상황설명 간략하게 하자면 그동안 화1이 적성에 맞아서 쭉 해오다가 23수능보고...
-
개인적으로 영어는 쉬운 국어라고 생각하는 입장이에요 유형이 정해져있고 국어랑 달리...
-
이러면 모든 과학고가 농어촌 못쓴다는건가요?
-
범위가 협소해서 그론가 28~30 다 빡빡하게 느껴졌는데 정상일까요? 글구 20번은...
-
저작권 이슈로 인해 문제 발문을 올리지 못하는 점 양해 부탁드립니다. 11번 좌우...
-
어리신 분들께 얕잡아 보이는 것보다 화나는 거는 없어요. 나이 말 하고 사과 해도 좀 언짢긴 해요
-
옯하 0
잇올 갔다오면 11시가 넘어서 바쁘네요 ㅜ 나름 열심히 살려고 노력중이에요
-
대답.
-
조교님 바꼈네 0
아 좋았는데 왜 안나오시지... ㅠㅠ
-
설명도 친절해
-
무보정이랑 보정이 십몇점 차이날 수가 있나 무보정 80후반이거나 90넘을 줄 알았는데
-
자존감높아서좋은거라생각해
-
이거 쉬운거 맞지요…? 1컷은 어느정도 돨까요……..?
-
당장 저게 잘 못 됐다고 해서 반박을 해버리는 것보다 그냥 말을 아끼는게 더 좋을 때가 있다...
-
화작 92 언매 90 미적 75 확통 80 강대갤 펌
-
유전은 완성까지 3
얼마나 걸림? 몇 일? 몇 문제? 몇 권?
-
칼럼쓸정도면 뭐 그 과목에 진심이라는걸 사람들이 알아주지 않을까요? 등급 낮은데...
-
아 대학 재밌다 3
낭만 미쳤다그냥
-
하고싶은말을 좋은말로 순화시킨거다
-
3~4년 전 오르비랑은 분위기가 많이 다르긴 하다 14
돌려줘
-
그런거 찾아볼 시간에 듣기라도 연습했으면 대학이 달라졌을텐데이년아
-
(전기분해) 둘다 마지막엔 결국 모두 환원되어 금속 질량이 증가할 때, 이온화...
-
고경제 보고 달리다간 텐션 풀려서 복학각 잡힐듯 경한 드가자
-
ㅇㄸ요
-
당연한거죠?
-
계산실수 뒤지게 많은데 어케 극복할까요 허
-
지금 다시 시작하는 분들 스피드 개념같은거라도 보시나요?
-
축구가 ㄹㅇ 수능이랑 느낌이 비슷함 매번 새로운 상황들 만나면서 머리 몸 빠르게...
-
집밥 먹구 싶다 9
엄마가 해주신 김치찜이 ㄹㅈㄷ 맛있는데
-
그러기위해 내일도 국어공부를 열심히!!!
-
1. 인문학탐구동아리 주제가 인문학+과학 입니다 관련해서 탐구할수있고 부장도 할수...
-
아마 말투가 띠꺼웠나봄 ㅉ
-
시바 2
운동하고 9시에 집와서 쭉 씻지도않고 오르비만했다 와슈빨
-
고민좀 0
대학 다니다가 파일럿이라는 꿈이 생겨서 고민중인데 23에 들어가도 항공대 항공운항...
-
수능 끝나고 많이 까먹어도 인정인데 수학은 ㄹㅇ 초등학교때부터 천천히 쌓아올렸으면...
-
맞팔 해줘요 10
-
의대 정원 감소 + 현역 인원수 최다 + 의반이들
-
서울대뱃지달고싶음 10
그걸목표로공부해보자그럼내똥글도뭔가철학적으로보이지않을까?으하하하하하하하하하으캬캬캬캬캬캬캬캬
-
문제 단원별로 나와있나요??? 모의고사 형식인가요??
-
의대증원 축소 얘기도 있고 뭔가 전체적으로 작년보다는 훨씬 빡세질거같은 느낌...
-
대면 비대면 다 해봤어요 대면은 어머님께서 감사하게도 매번 과일도 준비해 주시고...
-
수업 교재 의견부탁해요 36
다음 커리 교재 표지를 이렇게 가려고 하는데 어떤가요? 학생들이 학교에서 꺼낼 수...
-
부엉부엉부엉 1
부엉이 너무힘들다

반가워요 새해복 많이 받으세여