일지
자료구조...81
niamdank
2021. 4. 26. 12:16
ArrayListGraph 생성자 및 출력 함수 구현
ArrayListGraph.h
#pragma once
#include <iostream>
struct GraphHeader
{
GraphHeader(int value)
: m_idx(value), m_data(nullptr), m_next(nullptr)
{
}
int m_idx;
GraphNode* m_data;
GraphHeader* m_next;
};
struct GraphNode
{
GraphNode(int value)
: m_idx(value), m_next(nullptr)
{
}
int m_idx;
GraphNode* m_next;
};
class ArrayListGraph
{
public:
#pragma region 생성자
ArrayListGraph();
~ArrayListGraph();
#pragma endregion
#pragma region 속성
size_t NodeCount() { return m_nodeCount; }
#pragma endregion
#pragma region 메서드
void InsertNode();
void InsertEdge(int from, int to);
void RemoveNode(int index);
void RemoveEdge(int from, int to);
void Clear();
size_t GetDegreeIn(int index);
size_t GetDegreeOut(int index);
void PrintInfo();
#pragma endregion
private:
#pragma region Class Util
GraphHeader* PopHeader(int value);
void PushHeader(GraphHeader* header);
GraphNode* PopNode(int value);
void PushNode(GraphNode* node);
#pragma endregion
#pragma region 변수
size_t m_nodeCount;
GraphHeader* m_graphHeaders;
GraphHeader* m_freeHeaders;
GraphNode* m_freeNodes;
#pragma endregion
};
ArrayListGraph.cpp
#pragma region 생성자
/// <summary>
/// 지정된 크기 혹은 기본 크기의 ArrayListGraph를 생성한다.
/// </summary>
ArrayListGraph::ArrayListGraph()
: m_nodeCount(0), m_graphHeaders(nullptr), m_freeHeaders(nullptr)
{
}
/// <summary>
/// 메모리 누수를 막기 위해 동적 생성한 노드들을 제거한다.
/// </summary>
ArrayListGraph::~ArrayListGraph()
{
while (m_freeNodes != nullptr)
{
GraphNode* curNode{ m_freeNodes };
m_freeNodes = m_freeNodes->m_next;
delete curNode;
}
while (m_graphHeaders != nullptr)
{
GraphHeader* curHead{ m_graphHeaders };
m_graphHeaders = m_graphHeaders->m_next;
delete curHead;
}
while (m_freeHeaders != nullptr)
{
GraphHeader* curHead{ m_freeHeaders };
m_freeHeaders = m_freeHeaders->m_next;
delete curHead;
}
}
#pragma endregion
#pragma region 메서드
/// <summary>
/// 테스트용 리스트 정보 출력 함수
/// </summary>
void ArrayListGraph::PrintInfo()
{
std::cout << "----------------------\n";
std::cout << "Count: " << m_nodeCount << '\n';
GraphHeader* curHeader{ m_graphHeaders };
while (curHeader != nullptr)
{
std::cout << curHeader->m_idx << " : ";
if (curHeader->m_data == nullptr)
{
std::cout << "NULL\n";
}
else
{
GraphNode* curNode{ curHeader->m_data };
while (curNode != nullptr)
{
std::cout << curNode->m_idx << ' ';
curNode = curNode->m_next;
}
std::cout << '\n';
}
}
std::cout << "----------------------\n\n";
}
#pragma endregion
#pragma region Class Util
/// <summary>
/// 자유 공간 리스트에서 헤더를 가져오거나 새로 생성한다.
/// </summary>
/// <param name="value">헤더 생성 시 인덱스 값</param>
/// <returns>새 헤더</returns>
GraphHeader* ArrayListGraph::PopHeader(int value)
{
GraphHeader* newNode{ nullptr };
if (m_freeHeaders == nullptr)
{
newNode = new GraphHeader(value);
}
else
{
newNode = m_freeHeaders;
m_freeHeaders = m_freeHeaders->m_next;
newNode->m_idx = value;
newNode->m_data = nullptr;
newNode->m_next = nullptr;
}
return newNode;
}
/// <summary>
/// 자유 공간 리스트에 제거된 헤더를 저장한다.
/// </summary>
/// <param name="node">제거된 헤더</param>
void ArrayListGraph::PushHeader(GraphHeader* header)
{
header->m_next = m_freeHeaders;
m_freeHeaders = header;
}
/// <summary>
/// 자유 공간 리스트에서 노드를 가져오거나 새로 생성한다.
/// </summary>
/// <param name="value">노드 생성시 초기값</param>
/// <returns>새 노드</returns>
GraphNode* ArrayListGraph::PopNode(int value)
{
GraphNode* newNode{ nullptr };
if (m_freeNodes == nullptr)
{
newNode = new GraphNode(value);
}
else
{
newNode = m_freeNodes;
m_freeNodes = m_freeNodes->m_next;
newNode->m_idx = value;
newNode->m_next = nullptr;
}
return newNode;
}
/// <summary>
/// 자유 공간 리스트에 제거된 노드를 저장한다.
/// </summary>
/// <param name="node">제거된 노드</param>
void ArrayListGraph::PushNode(GraphNode* node)
{
node->m_next = m_freeNodes;
m_freeNodes = node;
}
#pragma endregion