계속해서 느끼는 것이지만, ADT를 생각하고 그림을 그려서 구현하는 게 가장 효과적인 길인 것 같다.


좀 더 생각해봐야 할 것:

구조체에 이런저런 멤버 함수를 만드는게 타당할까? 밑의 DNode는 별로 바람직해보이지 않는다.

아예 클래스로 만들어서 숨길 건 숨기고 객체화 하는게 '객체지향적'인 면에서는 좋을 것 같다.


struct DNode

{

int _data{ 0 };

DNode* _prev{ nullptr };

DNode* _next{ nullptr };


DNode(int n = 0) :_data(n) {};


void insert_before(DNode* point)

{

this->_next = point;

this->_prev = point->_prev;

if (point->_prev)

point->_prev->_next = this;

point->_prev = this;

}

void suicide()

{

if (this->_prev)

this->_prev->_next = this->_next;

if (this->_next)

this->_next->_prev = this->_prev;


delete this;

}

};


class DoubleLinkedList

{

private:

DNode* front{};

DNode* back{};


public:

DNode* begin() { return front; }

DNode* end() { return back->_next; }

DNode* Back() { return back; }


bool isEmpty()

{

return front == nullptr;

}

DNode* insert(DNode* point, int data)

{

if (front && !point) throw;


DNode* newNode = new DNode(data);


if (isEmpty())

{

front = back = newNode;

return newNode;

}

if (front == point)

front = newNode;


newNode->insert_before(point);


return newNode;

}

void erase(DNode* point)

{

if (isEmpty() || point == nullptr) throw;


if (point == front)

front = front->_next;

else if (point == back)

back = back->_prev;


point->suicide();


}

void push_back(int data)

{

DNode* newNode = new DNode(data);


if (isEmpty())

front = back = newNode;

else

{

newNode->_prev = back;

back->_next = newNode;

back = newNode;

}

}

void display()

{

cout << "double linked list : \n";

for (DNode* iter = begin(); iter; iter = iter->_next)

{

cout << iter->_data << endl;

}

if (!front) cout << "is empty\n";


}

void clear()

{

while (front)

{

DNode* temp = front;

front = front->_next;

delete temp;

}

back = nullptr;

}

};


'프로그래밍' 카테고리의 다른 글

구현 - 이진 트리  (0) 2018.03.08
구현 - 원형 싱글 링크드리스트  (0) 2018.03.07
구현 - 배열기반 덱  (0) 2018.03.04
구현 - 배열기반 원형 큐  (0) 2018.03.03
구현 - 스택 응용 문제 - 중위계산  (0) 2018.03.03