struct CharInfo
{
public:
wchar_t szName[20];
int HP;
int MP;
int SP;
int MaxHP;
int MaxMP;
int MaxSP;
public:
void SetInfo(const wchar_t* _strName, int _HP, int _MP, int _SP)
{
wcscpy_s(this->szName, _strName);
HP = MaxHP = _HP;
MP = MaxMP = _MP;
SP = MaxSP = _SP;
}
CharInfo()
: HP(0), MP(0), SP(0)
, MaxHP(0), MaxMP(0), MaxSP(0)
{}
~CharInfo()
{}
};
int main()
{
List<CharInfo> charlist;
CharInfo info = {};
wcscpy_s(info.szName, L"Warrior");
info.HP = 10;
info.MP = 10;
info.SP = 10;
info.MaxHP = 10;
info.MaxMP = 10;
info.MaxSP = 10;
}
template<typename T>
class List
{};
struct CharInfo
{
public:
wchar_t szName[20];
int HP;
int MP;
int SP;
int MaxHP;
int MaxMP;
int MaxSP;
public:
void SetInfo(const wchar_t* _strName, int _HP, int _MP, int _SP) // 4
{
wcscpy_s(this->szName, _strName); // 5
HP = MaxHP = _HP; // 6
MP = MaxMP = _MP;
SP = MaxSP = _SP;
}
CharInfo() // 3
: HP(0), MP(0), SP(0)
, MaxHP(0), MaxMP(0), MaxSP(0)
{}
CharInfo(const wchar_t* _strName, int _HP, int _MP, int _SP) // 2
: HP(0), MP(0), SP(0)
, MaxHP(0), MaxMP(0), MaxSP(0)
{
SetInfo(_strName, _HP, _MP, _SP);
}
~CharInfo()
{}
};
List<CharInfo> charlist;
int main()
{
CharInfo info(L"Warrior", 100, 30, 50); // 1
charlist.push_back(info); // 7
return 0;
}
charlist.push_back(CharInfo(L"Warrior", 100, 30, 50));
template<typename T>
struct Node
{
T Data; // 1
Node<T>* pNext; // 2
Node<T>* pPrev; // 3
//Node* pNext; // 4
//Node* pPrev; // 5
};
template<typename T>
class List
{
private:
Node<T>* m_pHead; // 6
Node<T>* m_pTail // 7
int m_CurCount; // 8
public:
List() // 9
: m_pHead(nullptr)
: m_pTail(nullptr)
, m_CurCount(0)
{}
~List() // 10
{}
};
// struct Ndoe에 구현
Node(const T& _Data, Node<T>* _Next, Node<T>* _Prev)
: Data(_Data)
, pNext(_Next)
, pPrev(_Prev)
{}
// 클래스 List에 구현
public:
void push_back(const T& _Data);
template<typename T>
/*inline*/ void List<T>::push_back(const T& _Data) // 1
{
//Node<T>* pNewNode = new Node<T>; // 3
//pNewNode->Data = _Data; // 4
//pNewNode->pNext = nullptr; // 5
//pNewNode->pPrev = nullptr; // 6
Node<T>* pNewNode = new Node<T>(_Data, nullptr, nullptr); // 7
if (0 == m_CurCount)//nullptr == m_pHead) // 2
{
m_pHead = pNewNode;
m_pTail = pNewNode; // 9
}
else // 8
{
m_pTail->pNext = pNewNode;
pNewNode->pPrev = m_pTail;
m_pTail = pNewNode;
}
++m_CurCount;
}
Node<T>* m_pHead;
Node<T>* m_pTail;
else
{
m_pTail->pNext = pNewNode; // 1
pNewNode->pPrev = m_pTail; // 2
m_pTail = pNewNode; // 3
}
gpt형님.
~List()
{
Node<T>* pNode = m_pHead; // 1
while (pNode) // 2
{
Node<T>* pNext = pNode->pNext; // 3
delete pNode; // 4
pNode = pNext; // 5
}
}
Node Next의 값을 입시로 옮겨버리고 옮겨났던 Next의 값을 Node에 다시 옮긴다.
1번에 헤드포인터 주소를 옮겨놓고 2번에 주소가 nullprt값이 아니라면 반복문 들어가서 그 Node의 Next주소 받아놓고 4번처럼 Node 지워 버린다. 3번을 안하면 넥스트 주소를 안받아버리면 노드의 넥스트 정보를 잃어버리기때문이다. 그리고 5번 3번에서 저장해둔 걸 노드의 값에 넣어버린다.
초기화
리스트를 통한 반복
노드 삭제
#include <iostream>
#include "List.h"
struct CharInfo
{
wchar_t szName[20];
int HP;
int MP;
int SP;
int MaxHP;
int MaxMP;
int MaxSP;
public:
void SetInfo(const wchar_t* _strName, int _HP, int _MP, int _SP)
{
wcscpy_s(szName, _strName);
HP = MaxHP = _HP;
MP = MaxMP = _MP;
SP = MaxSP = _SP;
}
CharInfo()
: HP(0), MP(0), SP(0)
, MaxHP(0), MaxMP(0), MaxSP(0)
{}
CharInfo(const wchar_t* _strName, int _HP, int _MP, int _SP)
: HP(0), MP(0), SP(0)
, MaxHP(0), MaxMP(0), MaxSP(0)
{
SetInfo(_strName, _HP, _MP, _SP);
}
~CharInfo()
{}
};
List<CharInfo> charlist;
int main()
{
//CharInfo(L"Warrior", 100, 30, 50) - 임시객체, 이름없는 지역변수
charlist.push_back(CharInfo(L"Warrior", 100, 30, 50));
charlist.push_back(CharInfo(L"Archer", 80, 50, 40));
charlist.push_back(CharInfo(L"Wizzard", 50, 100, 20));
return 0;
}
#pragma once
template<typename T>
struct Node
{
T Data;
Node<T>* pNext;
Node<T>* pPrev;
Node()
: Data()
, pNext(nullptr)
, pPrev(nullptr)
{}
Node(const T& _Data, Node<T>* _Next, Node<T>* _Prev)
: Data(_Data)
, pNext(_Next)
, pPrev(_Prev)
{}
};
template<typename T>
class List
{
private:
Node<T>* m_pHead;
Node<T>* m_pTail;
int m_CurCount;
public:
void push_back(const T& _Data);
public:
List()
: m_pHead(nullptr)
, m_pTail(nullptr)
, m_CurCount(0)
{}
~List()
{
Node<T>* pNode = m_pHead;
while (pNode)
{
Node<T>* pNext = pNode->pNext;
delete pNode;
pNode = pNext;
}
}
};
template<typename T>
void List<T>::push_back(const T& _Data)
{
Node<T>* pNewNode = new Node<T>(_Data, nullptr, nullptr);
if (0 == m_CurCount) //nullptr == m_pHead)
{
m_pHead = pNewNode;
m_pTail = pNewNode;
}
else
{
m_pTail->pNext = pNewNode;
pNewNode->pPrev = m_pTail;
m_pTail = pNewNode;
}
++m_CurCount;
}
1차 23.12.28
2차 23.12.29
3차 24.01.02
4차 24.01.03
5차 24.01.04