๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[Embedded ์ํ ํ๋ฐ์ง ๋๋ฐ์ง๐พ] ๋งํฌ๋ ๋ฆฌ์คํธ(linked list) ๊ตฌํํ๊ธฐ ๋ณธ๋ฌธ
[Embedded ์ํ ํ๋ฐ์ง ๋๋ฐ์ง๐พ] ๋งํฌ๋ ๋ฆฌ์คํธ(linked list) ๊ตฌํํ๊ธฐ
์ง์ง์ํ์นด 2023. 6. 26. 01:17<๋ณธ ๋ธ๋ก๊ทธ๋ ์ด์ํธ๋ฝ ๊ฒ์์์นด๋ฐ๋ฏธ ๋์ ์ ํ๋ธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค :-)>
=> [์๋ฃ๊ตฌ์กฐ / ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ 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;
}
};