컴공일기263
게시글 주소: https://i.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 답글 달기 신고
-
만표 58+2,3등급 블랭크...
-
질문받음 5
-
그거 난데 계획이 두리뭉실해서 그냥 본능적으로 해야할 것 같은 걸 함 그래서 한계에 부딪혔나
-
나이드니까 좀 6
사람이 좀 순해지고...잔인한거 자극적인거 말고 마음이 평온해지는 그런거를 찾게 됨...
-
음음
-
맞팔구 2
잘 안하려햇는데, 굳이 안할 이유가 없어보임뇨이제 밤마다 올릴꺼니까 그런줄 아삼
-
"170만 넘으면 돼 진짜로" ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
-
25 24 화작 3
25 24 화작 부분 다른 연도보다 어려운 편인가요?? 풀어보니까 시간이 훨씬 많이 걸려서
-
키작은 여자들도 2
주변 여사친들 중 키 150대 여자들도 남자 169 거들떠도 안보던데...
-
오랜만에 새르비하는데 도파민 좀 얻어가자
-
지금은따로모안하죠,? 실모시즌에만좀풀가
-
나랑 맞팔해줄 오뿡이 구함
-
고2 학생 과외중인데 쏀 끝내고 기출 들어가려는데 자이스토리 고2꺼를 할지 고3꺼를...
-
키 엄청 큰 남자랑 사귐 고목나무에 붙은 매미 조합... 키 어느 정도 되는...
-
무슨 이미지임?
-
질문받습니다 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
개 많네 개 빡치네 개 화나네 화아아악
-
ㅇㅇ
-
약대랑 비교했을 때 약대가 낫나? 미래 생각했을 때 그냥 궁금해서