컴공 일기63
게시글 주소: https://orbi.kr/00057123533
양방향 연결리스트, Double Linked List를 구현한 예제입니다.
저번에 insert 함수에서 segementation 관련 오류가 떠서 꽤나 한동안
만지작 거리고 있던 코드였는데, 어느 부분에서 문제가 생겼는지 이제 좀 확실해 져서 다시 올려봅니다.
이게 시각적으로 보면 사실... 말도 많고 어려워 보이지만, 정말 이 그림을 그냥 코드로 만들어 놓은 것 뿐이랍니다. 컴퓨터공학이라는 분야에서 주로 다루곤 하는 코딩이라는 게, 처음 배울 때는 꽤 어렵게 다가오지만 원리를 알면 익숙해집니다. (물론, 그 과정에서 수만가지 ERROR CODE를 목도하게 되겠지만...)
제가 생각하기에 코딩 실력을 향상할 때 가장 중요한 것은, 자신감이라고 생각해요.
지금 당장 이해가 안 되더라도, 내가 A난도 수준의 코드를 계속 공부하고 이해하려고 시도하면
어느 순간 나도 모르게 A난도 수준의 엔지니어가 됩니다. 말하자면, 계속 특정 어려운 코드를 보고
그것을 내 것으로 만들면 되는 겁니다. 근데, A난도가 아직 나에겐 벅차니까 쉬운 것만 보고 실습하면
절대로 A난도에 갈 수가 없지요.
저는 그래서, 예제 학습을 할 때 100라인 이상 정도 되는 코드들을 짜려고 하지요.
그 정도 라인을 넘겨서 긴 호흡으로, 가독성을 지켜가면서 짤려고 노력해야, 그 수준에
제가 위치하게 될 테니 말입니다. 하여간, 말이 좀 길었고...
우리가 일상 생활을 살다 보면, 여러가지 자료를 얻게될 때가 있어요.
하물며 개발을 하는 사람들 입장에선, 매일 매일을 데이터 속에서 살겠죠.
그렇다면, 우리가 고민해보아야 하는 건, "정리"일 것 같습니다.
다시 말해서, 이 데이터들을 어떻게 구조화시키고 정리할 것이냐가 꽤 중요한 논의가 된다는 것이죠.
그런 논의를 다뤄놓은 분야가 "자료구조"라는 분야랍니다. 말 그대로, 자료를 어떤 구조로 관리할 지를 고민하는 분야입니다. 양방향 연결 리스트라는 것도 결국 이 자료구조의 일종에 다름이 아니에요.
말하자면, 여러 데이터들을 묶을 때, 서로가 "상호 참조" 되도록 한 것입니다.
1번 학생의 성적, 2번 학생의 성적, 3번 학생의 성적 데이터가 있다고 할까요?
그렇다면, 양방향 연결리스트 구조는 이 세 가지의 데이터들을 정방향으로, 역방향으로 동시에 묶은 구조입니다.
이렇게 묶어 놓는다면 우리가 반 전체 성적표를 만들 때, 아주 편하게 만들어 볼 수 있죠.
1번 데이터 다음 2번, 2번 데이터 다음, 3번... 이런 식으로 순차적으로 데이터를 뽑아내기만 하면 되니까요.
또, 역순으로도 성적표를 뽑아낼 수도 있습니다. 3번 데이터가 2번을 가리키고, 2번 데이터가 1번을 가리키고 있으니까요. 양방향 연결 리스트는 이렇듯이 데이터를 정방향으로, 역방향으로 모두 출력될 수 있게 도와주는 구조인 것입니다.
제가 표현한 다음의 코드가 결국 이런 식으로 데이터를 관리한 것이랍니다.
#include <iostream>
using namespace std;
class CShape {
protected:
int x, y;
public:
CShape(int a, int b) : x(a), y(b) {}
//순수가상함수 : 추상 클래스 구조로 설계
virtual void Print() = 0;
};
template <typename T>
class CCircle : public CShape {
private:
T Radius;
public:
CCircle(int a, int b, T r) : CShape(a, b), Radius(r) {}
double GetArea() { return 3.14 * Radius * Radius; }
//가상화
void Print() { cout << this->GetArea() << endl; }
template <typename U>
friend ostream& operator << (ostream& out, CCircle<U>& rhs);
};
template <typename U>
ostream& operator << (ostream& out, CCircle<U>& rhs) {
cout << rhs.GetArea() << endl;
return out;
}
template <typename T>
struct Node {
T data;
Node<T>* next;
Node<T>* prev;
Node(T d, Node<T>* n = NULL) : data(d), next(NULL), prev(NULL) { }
};
template <typename T>
class ListIterator {
private:
Node<T>* ptr;
public:
ListIterator(Node<T>* p = 0) : ptr(p) {}
void operator++ (int) { ptr = ptr->next; }
void operator-- (int) { ptr = ptr->prev; }
Node<T>* operator&() {
return ptr;
}
T& operator* () { return ptr->data; }
ListIterator<T> operator+ (int adv)
{
return ptr;
}
void operator=(Node<T>* p)
{
ptr = p;
}
};
template <typename T>
class MyList {
private:
Node<T>* start;
Node<T>* last;
public:
MyList() : start(NULL), last(NULL) {}
typedef ListIterator<T> iterator;
Node<T>* begin() { return start; }
Node<T>* rbegin() { return last; }
void push(T d) {
Node<T>* temp = new Node<T>(d, NULL);
if (start == NULL) {
start = last = temp;
}
else
{
temp->prev = last;
last->next = temp;
last = temp;
}
}
void insert(iterator iter, T d) {
Node<T>* now = &iter;
Node<T>* newnode = new Node<T>(d, NULL);
newnode->next = now->next;
newnode->prev = now;
now->next = newnode;
newnode->next->prev = newnode;
}
};
int main()
{
int i;
MyList<CCircle<double> > intL;
MyList<CCircle<double> >::iterator lIter;
for (i = 0; i < 5; i++)
{
intL.push(CCircle<double>(1, 1, i + 1.1));
}
lIter = intL.begin();
intL.insert(lIter, CCircle<double>(1, 1, 1.1));
//정방향 데이터 출력
for (i = 0; i < 6; i++) {
cout << *lIter;
lIter++;
}
lIter = intL.rbegin();
//역방향 데이터 출력
for (i = 0; i < 6; i++) {
cout << *lIter;
lIter--;
}
return 0;
}
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
물리치료랑 간호조무사 쪽이었음 의대 지망이 다 화학 동아리로 가는 이유가 있었구나
-
어케 해야할까요... 실모 풀때마다 실수가 계속나와서 스트레스네요
-
물리학과 + 의학과 복수전공해야됨 ㄷㄷㄷ
-
5덮 결과 0
화작: 90 ( 23, 27, 32, 34) 독서론은 1번이 너무 이상한 답이어서...
-
점수맞히면 5000덕 12
힌트1 고2 20년 6월 수학 힌트 2 컨디션 저조하고 머리아픔 힌트 3 고2 3모...
-
확통 기출 2회독 거의 다 끝나가는데 교사경 vs N제 추천 좀 0
확통은 교사경이 나아요 아님 N제가 나아요? 2개다는 못 풀 듯 수완풀고 수완...
-
새 햄스터를 사오면 삼천원…
-
작년엔 이맘때였는데 정확한 날짜아시는분 계실까요?
-
사실 트렌드라 하긴 좀 뭐한데 암튼 그런게 체육이랑 심리학, 물리치료랑 재활치료...
-
원래 디자인 관심 없는데 이건 지리누 ㄷㄷ
-
우리집 수원이랑 한시간 - 한시간반 거린데 얼마나 쳐 놀앗으면…
-
블러드파운틴 0
-
센츄되네 10
이왜센 ㅋ
-
반수공부 ㅜㅜ 1
22333 화미물지였고 6모 응시 신청해놨고 물지->생윤사문 사탐런이고 작수끝나고...
-
풀어보죠. 9월은 수열 무서웡
-
왜 6시간 남음?ㅠ
-
돈을 못벌겠네
-
3,7,29
-
지하철 두 정거장 지나침ㅋㅋ 다시 빽해야지
-
근데 아싸라 축제를못감..
-
님들은 다이어리 왜 쓰시나요
-
어렸을때 천식 있었는데 감기도 약간 천식성 기침하고 그랬는데 수업 시간에 기침이...
-
ㄴㅇㅅ~~
-
6모 대비 실모 0
임정환t랑 이명학t는 대비 실모 안 나오나요? 일주일전부터 시뮬 돌리면서...
-
엉엉
-
도대체 어디서 보는거임? 열렸다는데 아무리 찾아도 어디서 보는지 ㅁㄹ겟음 설마 하루...
-
소득 상위구간들이나 누적 재산 많은 구간에다가 국내 소비 의무화 법안을 추진하는거임...
-
심찬우 현강 1
지금 현재 언매 5등급이고 심찬우 현강 듣는 현역 학생입니다.. 지금 인강이랑 현강...
-
언어와 매체 질문인데 4번이 왜 답인건가요? ㅓ는 ㅣ 모음이 아닌건가요? ㅣ 모음의...
-
후기 남김ㄱㄷ
-
수험생커뮤니티에 3
중독된 나
-
다니시는 분들 분위기 괜찮나요? 6평 이후에 가볼까 생각중인데 추천하시나여
-
부자보단 카푸어 느낌이 강해져서 그런지 강남엔 포르쉐가 더 많이 보이는듯
-
오늘의 실모 0
이감 3-1 언매 91 킬캠 2회 88(15,28찍맞) 더데유데 2회 80...
-
아니면 그냥 시간되면 바로 눌러도 되나요
-
낙곱새같은 맛인가용
-
건동홍은 좀 림들거같은데
-
너무 모르는 질문을 하는듯ㅡㅡ 그런가요???
-
교생쌤이 내번호따간후 오마카세 사줌 늦은 시간대라 교생쌤집에서 잠 쌤한테 나한테 왜...
-
1학기는 학점 채워서 들었고 2학기는 6학점(최소학점)만 듣고 반수 도전하고 싶은데...
-
어떻게생각하심?
-
사문 정답률 70%이하 문제들(개쳐쉬운 건 아닌데 어렵진 않은 문제들) 푸는 데...
-
출근 완 22
존나덥네시발
-
응깃 퇴근 4
좀만 자고 귱부해야지
-
영어 3초 생명 2후 수1 2후 윤사 3초가 떠버렸는데 다 100점 맞고 운좋으면...
-
안녕하세요, 자이오노스입니다. 이 글은 우울한 글입니다. 그러므로 우울한 글을...
-
서연고 뱃 들어오세요 20
명령합니다 저의 26수능을 대신 응시해주세요
Ai수준과 학부수준은 어느정도차이인가요
AI 정도를 공부하려면 대학원은 기본이라고 생각해요 :) 다만, 학부에서 배우는 컴퓨터구조, 알고리즘, 자료구조... 이걸 되게 잘 알고 있어야 하는 것 같습니다.
학부에서도 맛보기 형식으로 AI를 공부하기는 합니다. 대학교 마다 편차는 있겠지만, 저희 대학기준으로는 4학년에 배우게 되지요. 그러나, 그것 만으로는 턱부족입니다. 여러가지 심화이론이 있어서, 그것을 대학원에서 더 봐야 되겠지요... 요새 AI 대학원이 그렇게 인기가 많은 듯 합니다. 언제, 레드 오션이 될 진 모르겠지만.. 그래도 흥미로운 분야인 건 확실한 것 같아요 :D
성의있는 답변 너무 감사드려용