본문 바로가기
개발개발/자료구조

Double Linked List 구현 - c++

by 유잉유잉유잉 2025. 1. 1.
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

댓글