๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[Embedded ์œ„ํ•œ ํ•œ๋ฐœ์ง ๋‘๋ฐœ์ง๐Ÿพ] ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(linked list) ๊ตฌํ˜„ํ•˜๊ธฐ ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป IoT (Embedded)/C++

[Embedded ์œ„ํ•œ ํ•œ๋ฐœ์ง ๋‘๋ฐœ์ง๐Ÿพ] ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(linked list) ๊ตฌํ˜„ํ•˜๊ธฐ

์ง•์ง•์•ŒํŒŒ์นด 2023. 6. 26. 01:17
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ์–ด์†ŒํŠธ๋ฝ ๊ฒŒ์ž„์•„์นด๋ฐ๋ฏธ ๋‹˜์˜ ์œ ํŠœ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :-)>

=> [์ž๋ฃŒ๊ตฌ์กฐ / ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์˜ 1ํ™” - ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ(linked list) ๊ตฌํ˜„ (1/2 )

 

๐Ÿซง Linked List

 

๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์„ ํ˜•์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ž๋ฃŒ๊ตฌ์กฐ

๊ฐ ๋…ธ๋“œ๋Š” ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ ๋…ธ๋“œ์˜ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค

๊ฐ ๋…ธ๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์™€ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ํฌ์ธํ„ฐ๋ณ€์ˆ˜๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค

๋ฐฐ์—ด์˜ ์‚ฌ์ด์ฆˆ๋Š” ๊ณ ์ •๋˜์–ด ์žˆ๊ณ  ๋ฐฐ์—ด์„ ์„ ์–ธํ•  ๋•Œ ๋ฐฐ์—ด์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ํ•ญ์ƒ ์•Œ์•„์•ผ ํ•œ๋‹ค

๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋Š” head๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค

head๋…ธ๋“œ๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์–ด๋„ ํ•ญ์ƒ ์กด์žฌํ•œ๋‹ค

head๋กœ ์ •ํ•ด์ง„ ๋…ธ๋“œ๋Š” data๋ณ€์ˆ˜์— ์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค

 

๐Ÿซง ์•ž ๋’ค๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ & ์‚ญ์ œํ•˜๊ธฐ

๐Ÿพ main.cpp

#include <iostream>
#include "CLinkedList.h"

using namespace std;

int main() {
	CLinkedList<int>	listInt;

	for (int i = 0; i < 100; i++) {
		listInt.push_back(i);
	}

	cout << "Size : " << listInt.size() << endl;

	return 0;
}

 

๐Ÿพ CLinkedList.h

#pragma once
#include <assert.h>

template <typename T>
class CLinkedNode
{
	template <typename T>
	friend class CLinkedList;

private:
	CLinkedNode()
	{
		m_pNext = nullptr;
		m_pPrev = nullptr;
	}
	~CLinkedNode()
	{

	}
private:
	T				m_Data;		// ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
	CLinkedNode<T>* m_pNext;	// ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
	CLinkedNode<T>* m_pPrev;	// ์ด์ „ ๋…ธ๋“œ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
};

template <typename T>
class CLinkedList
{
public:
	CLinkedList()
	{
		m_pBegin = new NODE;
		m_pEnd = new NODE;

		// ์ฒ˜์Œ์—๋Š” ์ถ”๊ฐ€๋œ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ Begin ๋‹ค์Œ์œผ๋กœ End ์ง€์ •
		// End ์ด์ „์œผ๋กœ Begin ์ง€์ •
		m_pBegin->m_pNext = m_pEnd;
		m_pEnd->m_pPrev = m_pBegin;
		m_iSize = 0;
	}
	~CLinkedList()
	{
		clear();
		delete m_pBegin;
		delete m_pEnd;
	}

private:
	typedef CLinkedNode<T>	NODE;
	typedef CLinkedNode<T>*	PNODE;
private:
	PNODE	m_pBegin;
	PNODE	m_pEnd;
	int		m_iSize;

public:
	void push_back(const T& data)
	{
		PNODE	pNode = new NODE;
		pNode->m_Data = data;

		// ๋’ค์— ์ถ”๊ฐ€ ํ•ด์•ผํ•˜๋ฏ€๋กœ End์˜ ์ด์ „ ๋…ธ๋“œ ์–ป์–ด์˜ค๊ธฐ
		PNODE pPrev = m_pEnd->m_pPrev;

		// ์–ป์–ด์˜จ ์ด์ „ ๋…ธ๋“œ์™€ End ๋…ธ๋“œ ์‚ฌ์ด์— ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋…ธ๋“œ ์ถ”๊ฐ€
		pPrev->m_pNext = pNode;
		pNode->m_pPrev = pPrev;

		// End ๋…ธ๋“œ์™€ ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์—ฐ๊ฒฐ
		pNode->m_pNext = m_pEnd;
		m_pEnd->m_pPrev = pNode;

		++m_iSize;
	}

	void push_front(const T& data)
	{
		PNODE	pNode = new NODE;
		pNode->m_Data = data;

		// Begin ๊ณผ Begin ์˜ ๋‹ค์Œ ๋…ธ๋“œ ์‚ฌ์ด์— ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋…ธ๋“œ ์ถ”๊ฐ€
		PNODE	pNext = m_pBegin->m_pNext;
		// ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋กœ Begin ์˜ ๋‹ค์Œ ๋…ธ๋“œ ์ค€๋‹ค
		// Begin์˜ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ๋กœ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋…ธ๋“œ ์ค€๋‹ค
		pNode->m_pNext = pNext;
		pNext->m_pPrev = pNode;
		// Begin์˜ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋…ธ๋“œ๋ฅผ ์ค€๋‹ค
		// ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ๋กœ Begin ์„ ์ค€๋‹ค
		m_pBegin->m_pNext = pNode;
		pNode->m_pPrev = m_pBegin;

		++m_iSize;
	}

	void pop_back()
	{
		if (empty())
			assert(false);

		// ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ ์ง€์›Œ์•ผํ•˜๋ฏ€๋กœ End ์ด์ „ ๋…ธ๋“œ ์–ป๊ธฐ
		PNODE	pDeleteNode = m_pEnd->m_pPrev;
		// ์ง€์šธ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ
		PNODE	pPrev = pDeleteNode->m_pPrev;
		// ์ด์ „ ๋…ธ๋“œ์˜ ๋‹ค์Œ์„ End, End ์ด์ „์œผ๋กœ ์ด์ „ ๋…ธ๋“œ
		pPrev->m_pNext = m_pEnd;
		m_pEnd->m_pPrev = pPrev;

		// ๋…ธ๋“œ ์ง€์šฐ๊ธฐ
		delete pDeleteNode;

		--m_iSize;
	}

	void pop_front()
	{
		if (empty())
			assert(false);

		// ์ง€์šธ ๋…ธ๋“œ
		PNODE	pDeleteNode = m_pBegin->m_pNext;
		// ์ง€์šธ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ
		PNODE	pNext = pDeleteNode->m_pNext;
		// ์œ„ ๋…ธ๋“œ์™€ Begin ๋…ธ๋“œ ์—ฐ๊ฒฐ
		pNext->m_pNext = m_pBegin;
		m_pBegin->m_pPrev = pNext;

		// ๋…ธ๋“œ ์ง€์šฐ๊ธฐ
		delete pDeleteNode;

		--m_iSize;
	}

	T front()	const
	{
		if (empty())
			assert(false);

		return m_pBegin->m_pNext->m_Data;
	}

	T back()	const
	{
		if (empty())
			assert(false);

		return m_pEnd->m_pPrev->m_Data;
	}

	// Begin ๊ณผ End ๋ฅผ ์ œ์™ธํ•œ ์‹ค์ œ ์ถ”๊ฐ€ํ•œ ๋…ธ๋“œ์˜ ์‚ญ์ œ ๊ธฐ๋Šฅ
	void clear()
	{
		PNODE	pNode = m_pBegin->m_pNext;

		while (pNode != m_pEnd)
		{
			// ํ˜„์žฌ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ ์–ป๊ธฐ
			PNODE	pNext = pNode->m_pNext;
			// ํ˜„์žฌ ๋…ธ๋“œ ์ง€์šฐ๊ธฐ
			delete pNode;
			// pNode์— ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฃผ์†Œ ๋„ฃ๊ธฐ
			pNode = pNext;
		}

		m_iSize = 0;

		// Begin๊ณผ End ์„œ๋กœ ์—ฐ๊ฒฐ
		m_pBegin->m_pNext = m_pEnd;
		m_pEnd->m_pPrev = m_pBegin;
	}

	int size()	const
	{
		return m_iSize;
	}

	// ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ true, ์•„๋‹ˆ๋ฉด false
	bool empty()	const
	{
		return m_iSize = 0;
	}
};

728x90
๋ฐ˜์‘ํ˜•
Comments