본문 바로가기
자료구조

[자료구조] Single Linked List (C++)

by 송파감자 2023. 10. 15.

자료구조 스터디를 옆자리 짝꿍과 다시 시작했다.

매주 1개씩 구현해보기로 했다.

오랜만에 다시 짜니까 2시간 정도 걸렸다. 

 

아래는 C++로 구현한 싱글링크드리스트!

private member로 Head와 Count변수를 썼다.

노드 추가 시 Count++,

노드 제거 시 Count--해서 노드 수를 카운트 해줬다.

/*23-10-15 다시 짜본 싱글링크드리스트*/
#include <iostream>
using namespace std;

typedef struct Node
{
	int Data;
	Node* NextNode;

	Node(int NewData) : Data(NewData), NextNode(nullptr) {};
};
class SingleLinkedList
{
public:
	SingleLinkedList() : Head(nullptr), Count(0) {};
	~SingleLinkedList()
	{		
		while (Head != nullptr)
		{
			Node* DeleteNode = Head;
			Head = Head->NextNode;
			delete DeleteNode;
		}
	}

public:
	/*생성*/
	Node* CreateNode(int NewData)
	{
		Node* NewNode = new Node(NewData);
		return NewNode;
	}

	/*추가*/
	void AddNode(Node* NewNode)
	{
		if (Head == nullptr)
		{
			Head = NewNode;
		}
		// 헤드가 있을 경우 꼬리 뒤에 붙인다
		else
		{
			Node* Tail = Head;
			while (Tail->NextNode != nullptr)
			{
				Tail = Tail->NextNode;
			}
			Tail->NextNode = NewNode;
		}
		// 노드 수 카운트 
		Count++;
	}

	/*출력*/
	void Print()
	{
		cout << "노드 수 : " << Count << endl;

		// 헤드부터 노드의 데이타들 출력
		Node* Current = Head;
		while (Current->NextNode != nullptr)
		{
			cout << Current->Data << ' ';
			Current = Current->NextNode;
		}
		cout << Current->Data << ' ' << endl;
	}

	/*탐색*/
	Node* SearchNode(int SearchIndex)
	{
		Node* Current = Head;

		// 헤드부터 카운트하는데...
		while (Current->NextNode!= nullptr && --SearchIndex > 0)
		{
			Current = Current->NextNode;
		}

		return Current;
	}

	/*뒤에 삽입*/
	void InsertAfterNode(int Index, Node* NewNode)
	{
		// 탐색해서 어떤 애 뒤에 연결할지를 알아야 함
		Node* Current = SearchNode(Index);

		// 새로운 애를 먼저 연결하고, 앞에 있는 애를 새로운 애한테 연결		
		NewNode->NextNode = Current->NextNode;
		Current->NextNode = NewNode;

		Count++;
	}

	/*노드 소멸*/
	void DestroyNode(Node* DeleteTarget)
	{
		free(DeleteTarget);
	}

	/*노드 삭제*/
	void DeleteNode(Node* DeleteTarget)
	{
		// 딜리트 할 애가 Head일 때
		if (DeleteTarget == Head)
		{
			Head = DeleteTarget->NextNode;
		}
		// 헤드가 아닐 경우
		else
		{
			Node* Current = Head;
			while (Current != nullptr && Current->NextNode != DeleteTarget)
			{
				Current = Current->NextNode;
			}
			if (Current != nullptr)
			{
				Current->NextNode = DeleteTarget->NextNode;
			}			
		}
		DestroyNode(DeleteTarget);
		Count--;
	}

private:
	Node* Head;
	int Count;
};

int main()
{
	SingleLinkedList SLL;

	SLL.AddNode(SLL.CreateNode(1));
	SLL.AddNode(SLL.CreateNode(2));
	SLL.AddNode(SLL.CreateNode(3));
	SLL.AddNode(SLL.CreateNode(4));
	SLL.AddNode(SLL.CreateNode(5));
	SLL.Print();
	
	SLL.InsertAfterNode(3, SLL.CreateNode(9));
	SLL.Print();

	SLL.DeleteNode(SLL.SearchNode(4));
	SLL.Print();

	return 0;
}

'자료구조' 카테고리의 다른 글

[자료구조] DFS와 BFS  (0) 2024.08.02
[자료구조] Double Linked List (C++)  (1) 2023.10.23
[자료구조] Stack 구현 (C++)  (3) 2023.03.19
[자료구조] Stack 개념 정리  (2) 2023.03.18