본문 바로가기

SW Study/기타 프로그래밍 학습

Linked List

//Linked List 구조
#include <iostream>
using namespace std;

struct Node //노드 구조
{
	int val;
	Node * next;
};

class Iterator //순회자 클래스
{
public:
	Node * CurrentNode;
	void Next() //다음으로 이동
	{
		CurrentNode = CurrentNode->next;
	}
	int PointVal() //가리키는 값
	{
		return CurrentNode->val;
	}
	bool Compare(Iterator diffIter) //노드 비교
	{
		// return CurrentNode != diffIt.CurrentNode;
		if (CurrentNode != diffIter.CurrentNode)
			return true;
		return false;
	}
};

class List //리스트 생성
{
public:
	Node head;
	Node tail;
	int num;

	void Default() //노드 초기화
	{
		head.next = &tail;
		num = 0;
	}
	void Add(int order, int val) //노드 추가하기
	{
		//0. 이전 노드로 이동
		Node * PrevNode = &head;
		for (int i = 1; i < order; i++)
		{
			PrevNode = PrevNode->next;
		}

		//1. 새 노드 준비
		Node * NewNode = new Node;
		NewNode->val = val;

		//2. 연결
		NewNode->next = PrevNode->next;
		PrevNode->next = NewNode;
		//
		num++;
	}
	void Delete(int order) //노드 삭제
	{
		//0. 이전 노드로 이동
		Node * PrevNode = &head;
		for (int i = 1; i < order; i++)
		{
			PrevNode = PrevNode->next;
		}

		//1. 삭제할 노드 기억
		Node * DeleteNode = PrevNode->next;

		//2. 연결
		PrevNode->next = PrevNode->next->next;

		//3. 삭제
		delete DeleteNode;
		//
		num--;
	}
	int Read(int order) //노드 읽기
	{
		//0. 해당 순서의 노드로 이동
		Node * CurrentNode = &head;
		for (int i = 1; i <= order; i++)
		{
			CurrentNode = CurrentNode->next;
		}
		return CurrentNode->val;
	}
	int Number() { return num; } //노드 갯수

	Iterator Begin() //시작 순회자
	{
		Iterator BeginIter;
		BeginIter.CurrentNode = head.next;
		return BeginIter;
	}
	Iterator End() //마지막 순회자
	{
		Iterator EndIter;
		EndIter.CurrentNode = &tail;
		return EndIter;
	}
};

void main()
{
	List list1;
	list1.Default();
	list1.Add(1, 1);
	list1.Add(2, 2);
	list1.Add(1, 3);

	for (Iterator iter = list1.Begin(); iter.Compare(list1.End()); iter.Next()) //해당 순회자가 만나는 지점까지 반복
	{
		cout << iter.PointVal() << endl;
	}
}