개발개발/자료구조
Double Linked List 구현 - c++
유잉유잉유잉
2025. 1. 1. 08:27
728x90
241231.zip
15.47MB
// LinkedList.h (인라인 클래스)
#pragma once
#include <iostream>
#include <assert.h>
template <typename T>
class CListNode
{
template <typename T>
friend class CLinkedList_Rework;
private :
CListNode () {}
~CListNode () {}
typedef CListNode<T> NODE;
private :
T mData;
NODE* mPrev = nullptr;
NODE* mNext = nullptr;
};
template <typename T>
class CLinkedList_Rework
{
private :
template <typename T>
friend class CListNode;
typedef CListNode<T> NODE;
int mSize = 0;
NODE* mBegin;
NODE* mEnd;
public :
CLinkedList_Rework ()
{
mBegin = new NODE;
mEnd = new NODE;
mSize = 0;
mBegin->mNext = mEnd;
mEnd->mPrev = mBegin;
}
~CLinkedList_Rework ()
{
if ( !empty() )
clear ();
delete mBegin;
delete mEnd;
}
void push_back ( const T& data )
{
NODE* node = new NODE;
node->mData = data;
NODE* last = mEnd->mPrev;
last->mNext = node;
node->mPrev = last;
mEnd->mPrev = node;
node->mNext = mEnd;
mSize++;
}
void push_front ( const T& data )
{
NODE* node = new NODE;
node->mData = data;
NODE* front = mBegin->mNext;
node->mNext = front;
front->mPrev = node;
node->mPrev = mBegin;
mBegin->mNext = node;
mSize++;
}
void pop_back ()
{
if (empty ())
{
AllPrint ();
return;
}
NODE* deleteNode = mEnd->mPrev;
NODE* last = deleteNode->mPrev;
last->mNext = mEnd;
mEnd->mPrev = last;
delete deleteNode;
--mSize;
}
void pop_front ()
{
if (empty ())
{
AllPrint ();
return;
}
NODE* deleteNode = mBegin->mNext;
NODE* front = deleteNode->mNext;
front->mPrev = mBegin;
mBegin->mNext = front;
delete deleteNode;
--mSize;
}
int size () const { return mSize; }
bool empty () const { return mSize == 0; }
void clear ()
{
if (empty ())
{
AllPrint ();
return;
}
while (mBegin->mNext != mEnd)
{
NODE* node = mBegin->mNext;
mBegin->mNext = node->mNext;
delete node;
}
mEnd->mPrev = mBegin;
mSize = 0;
}
// 내용 단순 출력용 함수
void AllPrint ()
{
if (empty ())
{
std::cout << "list is empty! " << std::endl;
return;
}
std::cout << "---------------------" << std::endl;
NODE* node = mBegin->mNext;
while (node != mEnd)
{
std::cout << node->mData << std::endl;
node = node->mNext;
}
std::cout << "---------------------" << std::endl;
}
};
// main.cpp
#include "LinkedList_Rework.h"
int main ()
{
CLinkedList_Rework<int> iList;
for (int i = 0 ; i < 4; i++)
{
iList.push_back ( i );
}
iList.AllPrint ();
std::cout << std::endl;
iList.pop_front ();
iList.pop_back ();
iList.AllPrint ();
iList.clear ();
iList.push_front (99);
iList.push_front (88);
std::cout << std::endl;
iList.AllPrint ();
return 0;
}

728x90