일지

자료구조...83

niamdank 2021. 4. 28. 08:19

ArrayListGraph 삭제 메서드)

그래프에서 사용하는 삭제 메서드를 구현한다.

 

ArrayListGraph.cpp

/// <summary>
/// ArrayListGraph에서 지정된 인덱스의 노드를 제거한다.
/// </summary>
/// <param name="value">제거할 값</param>
void ArrayListGraph::RemoveNode(int num)
{
	if (!ContainsNode(num))
	{
		std::cout << "존재하지 않는 노드를 제거하려 하고 있습니다.\n";
		return;
	}

	GraphHeader* curHeader{ m_graphHeaders };

	while (curHeader != nullptr)
	{
		if (ContainsEdge(curHeader->m_idx, num))
		{
			RemoveEdge(curHeader->m_idx, num);
		}

		curHeader = curHeader->m_next;
	}

	GraphHeader* prevHeader{ nullptr };
	curHeader = m_graphHeaders;

	while (curHeader != nullptr)
	{
		if (curHeader->m_idx == num)
		{
			break;
		}

		prevHeader = curHeader;
		curHeader = curHeader->m_next;
	}

	if (prevHeader == nullptr)
	{
		m_graphHeaders = curHeader->m_next;
	}
	else
	{
		prevHeader->m_next = curHeader->m_next;
	}

	PushHeader(curHeader);

	m_nodeCount--;
}

/// <summary>
/// ArrayListGraph에서 from -> to 인 간선을 제거한다.
/// </summary>
/// <param name="from">시작 노드</param>
/// <param name="to">끝 노드</param>
void ArrayListGraph::RemoveEdge(int from, int to)
{
	if (!ContainsNode(from) || !ContainsNode(to))
	{
		std::cout << "존재하지 않는 에지를 제거하려 하고 있습니다.\n";
		return;
	}

	GraphHeader* targetHeader{ GetTargetHeader(from) };

	GraphNode* prevNode{ nullptr };
	GraphNode* curNode{ targetHeader->m_data };

	while (curNode != nullptr)
	{
		if (curNode->m_idx == to)
		{
			break;
		}

		prevNode = curNode;
		curNode = curNode->m_next;
	}

	if (prevNode == nullptr)
	{
		targetHeader->m_data = curNode->m_next;
	}
	else
	{
		prevNode->m_next = curNode->m_next;
	}

	PushNode(curNode);
}

/// <summary>
/// ArrayListGraph의 모든 노드 및 간선을 제거한다.
/// </summary>
void ArrayListGraph::Clear()
{
	while (m_graphHeaders != nullptr)
	{
		GraphHeader* curHead{ m_graphHeaders };
		m_graphHeaders = m_graphHeaders->m_next;
		PushHeader(curHead);
	}

	m_nodeCount = 0;
}

 

main.cpp

#include <iostream>
#include "Graph/ArrayListGraph.h"

// 생성한 자료구조 테스트용 메인
int main()
{
	ArrayListGraph graph;
	graph.InsertNode(1);
	graph.InsertNode(2);
	graph.InsertNode(3);
	graph.InsertNode(4);

	graph.InsertEdge(1, 2);
	graph.InsertEdge(1, 4);
	graph.InsertEdge(2, 3);
	graph.InsertEdge(2, 4);
	graph.InsertEdge(3, 4);

	graph.PrintInfo();

	graph.RemoveEdge(1, 4);

	graph.PrintInfo();

	graph.RemoveNode(2);

	graph.PrintInfo();
}

 

실행결과

----------------------
Count: 4
4 : NULL
3 : 4
2 : 4 3
1 : 4 2
----------------------

----------------------
Count: 4
4 : NULL
3 : 4
2 : 4 3
1 : 2
----------------------

----------------------
Count: 3
4 : NULL
3 : 4
1 : NULL
----------------------