C++ Linked List

2024. 12. 7. 02:56·C++
반응형

Template과 Node를 이용하여 간단하게 linked list 구현을 시도해보았다.

 

Template을 통한 다양한 자료형을 이용할 수 있도록 하며, 뒤쪽부터 삽입하는 Push와 뒤쪽부터 데이터를 제거하는 Pop 전체 데이터를 정리하는 Clear, 데이터의 개수를 반환하는 size함수까지 구현해보았다.

 

#include <iostream>

using namespace std;

template <class T>
class Node
{
public:
	Node() : Value(0), Next(nullptr) {}

	T			Value;
	Node*		Next;
};

template <class T>
class linklist
{
public:
	linklist() : NodeCount(0), Head(nullptr) {};
	~linklist();

public:
	void			Print() const;

	void			Push(const T& data);
	void			Pop();
	void			Clear();

	int				size() const;

	Node<T>*		CreateNode();

private:
	int				NodeCount;
	Node<T>*		Head;
};

template<class T>
linklist<T>::~linklist()
{
}

template<class T>
void linklist<T>::Print() const
{
	if (Head == nullptr)
	{
		cout << "빈 공간\n";
		return;
	}

	Node<T>* pNode = Head;
	while (pNode != nullptr)
	{
		cout << pNode->Value<<" ";
		pNode = pNode->Next;
	}
	cout <<"\n";
}

template<class T>
void linklist<T>::Push(const T& data)
{
	Node<T>* newNode = CreateNode();
	newNode->Value = data;

	if (Head == nullptr)
	{
		Head = newNode;
	}
	else
	{
		Node<T>* lastNode = Head;
		while (true)
		{
			if (lastNode->Next == nullptr)
			{
				lastNode->Next = newNode;
				break;
			}
			else
			{
				lastNode = lastNode->Next;
			}
		}
	}

	NodeCount++;
}

template<class T>
void linklist<T>::Pop()
{
	if (Head == nullptr) return;

	Node<T>* lastNode = Head;
	Node<T>* prevNode = nullptr;
	while (true)
	{
		if (lastNode->Next == nullptr)
		{
			if (NodeCount == 1) Head = nullptr;

			lastNode->Value = 0;
			if(prevNode!=nullptr) prevNode->Next = nullptr;
			delete lastNode;
			break;
		}
		else
		{
			prevNode		= lastNode;
			lastNode		= lastNode->Next;
		}
	}

	cout << "제거\n";
	NodeCount--;
}

template<class T>
void linklist<T>::Clear()
{
	if (Head == nullptr) return;

	Node<T>* node = Head;
	Node<T>* dnode;

	while (true)
	{
		if (node->Next == nullptr)
		{
			delete node;
			Head = nullptr;
			break;
		}
		else
		{
			dnode = node;
			node = node->Next;

			dnode->Next = nullptr;
			delete dnode;
		}
	}
	NodeCount = 0;
}

template<class T>
int linklist<T>::size() const
{
	cout << NodeCount << "\n";
	return NodeCount;
}

template<class T>
Node<T>* linklist<T>::CreateNode()
{
	Node<T>* newNode = new Node<T>;
	
	return newNode;
}

int main()
{
	linklist<int> list;
	
	while (true)
	{
		int select;
		cout << "\n행동을 선택(-1 : Exit, 0 : print, 1 : push, 2 : pop, 3 : clear, 4 : size) : ";	cin >> select;

		if (select == -1) break;

		switch (select)
		{
		case 0:
			list.Print();
			break;
		case 1:
			double data;
			cout << "Push할 데이터 입력 : ";	cin >> data;
			list.Push(data);
			break;
		case 2:
			list.Pop();
			break;
		case 3:
			list.Clear();
			break;
		case 4:
			list.size();
			break;
		case 5:

			break;
		default:
			break;
		}
	}

	return 0;
}

 

 

반응형
저작자표시 (새창열림)

'C++' 카테고리의 다른 글

C++ 삽입 정렬과 퀵 정렬 학습  (2) 2025.08.13
함수 포인터 (typedef, using, std::function)  (1) 2024.12.14
OpenGL : Laplacian Smoothing & Taubin Smoothing  (1) 2024.11.24
cout 소수점 고정  (0) 2024.11.24
string::find  (1) 2024.11.24
'C++' 카테고리의 다른 글
  • C++ 삽입 정렬과 퀵 정렬 학습
  • 함수 포인터 (typedef, using, std::function)
  • OpenGL : Laplacian Smoothing & Taubin Smoothing
  • cout 소수점 고정
숯불돼지왕갈비
숯불돼지왕갈비
  • 숯불돼지왕갈비
    게임 개발 공부기
    숯불돼지왕갈비
  • 전체
    오늘
    어제
    • 분류 전체보기 (302)
      • 학교수업 (165)
      • 취업강의 (6)
      • C++ (49)
        • 코딩 테스트 (4)
      • Unreal Engine 5 (25)
        • MMORPG 개발 (25)
      • Unreal Engine 4 (44)
        • Omak Project (3)
        • Unreal Engine 4 개발일지 (9)
        • Unreal Engine 4 (32)
      • Unity (1)
        • 개발 일지 (1)
      • 수학 (3)
        • 소프트웨어 공학용 수학 (3)
      • DirectX 11 (4)
      • 게임 디자인 패턴 (2)
      • 포트폴리오 (1)
      • 자격증 (1)
        • 정보처리기사 (0)
        • SQLD (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
숯불돼지왕갈비
C++ Linked List
상단으로

티스토리툴바