컴공일기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 답글 달기 신고
-
삼수vs삼반수 1
지금 사범대 과학계열 학교 다니고 있는 학생입니다. 작년 수능을 공부를 안하고...
-
사4=과1 5
제발 사탐황들한테 깝치지마셈 과탐은 그냥 발로 풀어도 다 맞춘다 내가 손으로 풀어서...
-
3등급일수도 있음?
-
고양이 보고가요 19
-
외박 후 복귀 0
운동 조지고 ktx 타러 하 가기싫다
-
한지 재밌긴한데 0
한번 공부 안하면 계속 놓게되더라 걍 내 성향 문제일수도
-
한완수로만 해도 아무문제 없을까요?? 아니면 세젤쉬같은 컴팩트한 강의와 병행할까요?...
-
점심여캐투척 8
음역시귀엽군
-
100점이 목표인데 풀커리랍시고 쉬운 n제 굳이굳이 풀기 ->쉬운 문제는 어려운...
-
91 99 2 87 99 가려면 얼마만큼 올려야하나요??? 전반적으로 올린다고 봤을때
-
내려쳐질때마다 기분이좋아요 내가선택과목선택영역1등급 개꿀벌임이증명되는느낌임 흐흐흐흐흐흐
-
걍 기출 벅벅 하니까 고1, 2 모고는 1 뜨길래 내 방법이 맞는 건 줄.. 근데...
-
원래 이런가요? 기출 처음 푸는데 4점짜리 30문제가지고 며칠씩 붙잡고 있네요ㅠㅠ...
-
그게 나야 바 둠바 두비두밥~ ^^
-
텝스 준비 방법 4
텝스 뭐 준비할게 있을까요... 영어 2라 기영은 피해야되는데
-
언미물1지1 입니다. 6모 41231 9모 13233 수능 2(89) 1(97) 2...
-
피파 5천억 팀 2
추천좀요
-
생윤 사문인데 사문 도표랑 타임어택 , 퍼즐 , 채점 문제 이런거 짜증남
-
얼버기 5
오늘은 날씨가 별루안춥네
-
잘 맞는거 고르면 그 과목 잘 볼 확률이 높고 국영수에 투자할 시간이 ‘더’생김.....
-
덕코내놧 7
내놧
-
고전시가 0
공부 어케해야함?? 내신처럼 어휘 달달 외워야하나 좀 많이 까먹었는데 김승리 풀커리...
-
무슨 일이 있었던 건 아니고 갑자기 1월 초부터 미친듯이 무기력하고 우울합니다 정말...
-
제가 좀 내성적이고 말주변이 없고 아이들을 별로 안좋아하는데 그러면...
-
ㅇㅂㄱ 9
-
https://n.news.naver.com/article/020/0003609015...
-
얼버기 20
오르비언들 행복해야해요
-
경희대 빵 14
2칸스나로 넣었는데 85명 뽑는데 점공계산기로 지금 예비 31 뜹니다. 이거 될 수도 있을까요 ?
-
[단독] 검찰, 마약 매수 '깐부' 회장 여친 사진 공유 자료 확보 5
[서울=뉴시스] 오정우 기자 = 수도권 명문대 대학생 2000여명이 가입한 전국...
-
살빼야겠음ㄹㅇ 4
중3졸사는 얄쌍한데 지금은 무슨 좃돼지가 한 명잇노..
-
고대 언제 떠 2
-
그냥 작년이랑 원리 자체는 비슷한데 일단 지원자 자체가 적고(아무래도 전전에 어그로...
-
메타도 계속 바뀌고 패치를 꾸준히 해줘서 질리지가 않음
-
생명1 훈수 좀 0
고2 때 내신으로 한 바퀴 꼼꼼히 돌렸었음 막전위 근수축 유전할 때만 학원 들었었고...
-
2학기 휴학했다가 반수 실패하면 돌아갔을때 수습불가한가요? 3
1학기는 수업 잘 들었다치고 2학기는 휴학해서 바로 반수준비할때.. 만약 실패한다면...
-
미미미누 참가자 얼굴보고 뽑음? 너무 외모지상주의 아닌가 앞으로 헬스터디 3 전회차 시청한다 딱대
-
저는 그사람의 수업을 들은적도 없고, 댓글알바시절 수험생도 아니지만, 범죄를...
-
제가 상근이라 훈련소가 3월 중순에 끝나는데 그때 쯤에 시대라이브 현정훈 듣기...
-
내가 생각하는 노프사 실현해볼까 생각중임 레어도 승인 중지된거같고
-
흐흐흐흐 좋네
-
연세대vs고려대 2
일단 빵은 연세대가 이겼다 초코랑 녹차 크림빵 냉동실에 얼려서 드셔보세요 이거...
-
롤 탑 추천좀 43
문도 원챔인데 맨날 아래에서 사고가 좋게든 나쁘게든 크게 나서 템 나오고 크기 전에...
-
맞팔99 3
옥땅으루 따라와.
-
좀 도와줘라.
-
펴자마자 기하가 그리워지는구나.. 근데 정사영 보면 다시 확통이 그리울 듯
-
한티 밥짓는집 2
왔다
-
A는 B라는 것에서 B`는 C함을 알 수 있다 이런 형식의 선지를 만들 때 평가원...
-
닉변 완료. 1
후후...
-
맬 2,3시까지 놀아도 갠찮았는데 요즘음 10시만 되도 피곤함이...
-
24학년 헌내기예요