-
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