C# Linked List(Node)

2023. 6. 11. 03:50C# 프로그래밍 개념

Linked List에 앞서서 먼저 노드에 대한 정리

 

노드는 자기 자신 안에 또 자기 자신의 형태로 된 걸 갖고 있는 클래스라고 할 수 있다. 레퍼런스로 노드가 가리키는 걸로 진행하는 구조

 

노드는 자료구조에서만 쓰는 것이 아니고, 자료구조라고 하면 자료를 보관해야 하니까 연결도 하는 경우가 보편적이다.

예를 들어서, 이렇게 선언하고 진행하면 Data는 노드 안에 들어가 있는 값이고, Next는 다음으로 가리키는 노드를 받기 위해서 만든 거고 연결은 따로 진행한다. Prev도 전의 노드라는 의미인데 따로 연결하는 코드를 만들어서 진행할 것이다.

 

나중에 Next로 마지막으로 이동하면 null이 된다.

이렇게 Next를 Node1 -> Node2 -> Node3이런 식으로 정해놓고 Console.WriteLine으로 출력하는 방식으로 진행할 수 있다.

처음에 Node1이 나오고 다음 노드를 이어서 출력하고 그 다음 노드가 null이 되어서 while문으로 부터 빠져나오는 구조로 된다.

그림으로 나타내면 대충 이런 식이다. 현재 Node1에서 Next로 설정된 Node2로 이동하고 Node3으로 이동한다.

 

반대로 Prev도 세팅 Node3.Prev = Node2; Node2.Prev = Node1; 이런 식으로 할 수 있다. 

Node<int> RevCurNode = Node3;

 

while문도 설정해서 RevCurNode = RevCurNode.Prev;

 

LinkedList는 시퀀스 형이고 노드형 데이터 구조를 가졌다. 방이 다른 방과 연결되어 있다(게임)는 개념으로 사용되는 경우가 있다.

 

이런 노드를 사용하는 게 LinkedList다. LinkedList<int> List1 = new LinkedList<int>();

List1.AddFirst(10); 뭐 이런 게 있다. 

 

처음에 10이 딱 들어가게 된다. LinkedList는 최초가 의미가 없다. AddFirst AddLast 최초에 뭘해도 의미가 없다.

 

List1.AddFirst(10);

 

List1.AddFirst(20); 이러면 20이 가장 앞에 붙는다. AddFirst 자체가 앞에 붙인다는 의미다.

List1.AddFirst(33); 이러면 33 20 11 이런 순서대로 붙는다.

 

LinkedListNode<int> LoopNode = List1;

 

노드라는 클래스가 있고, 여기에서

 

First, Last도 저장되어 있다. 맨 앞과 맨 뒤의 자리.

for문에서 두 번째 줄에 .Next 뺴야 됨.

이런 식으로 시작 노드에서 하나하나씩 증가시키면서 출력할 수 있다. 이러면 33 20 11 이런 순서대로 출력이 된다.

그리고 이번엔 거꾸로 해본다. LinkedList에서 자동으로 관리해 준다. 알아서 관리를 해준다. Next, Previous 

그냥 리스트는 시퀀스 배열형. 

LinkedList는 시퀀스 노드형이다.

 

응용은 무궁무진하게 할 수 있다. 장점은? 

 

배열형은 중간에 날려버릴 수가 없다. 쏙 빼먹어 버리는 게 불가능하다. 하나를 날려버리면 날려버린 걸 빼고 다 복사한 다음에 복사해서 새로 만든 뒤에 원래 있던 거를 지워버리는 식으로 한다.

 

중간에 하나를 빼는 게 배열에서는 굉장하게 짜증나는 것이라고 할 수 있다. 배열은 답도 없이 연결되어 있다. 누군가와 연결되어 있다는 걸 선택으로 할 수가 없다. 둘이 밀착되어 있는 형태다. 

 

LinkedList에서 중간에 지우는 함수

 

List1.Remove(10); 이런 식으로 하면 날아간다. 맨처음에 최초로 들어올 때에는 AddFirst과 AddLast고 상관이 없다. 이러다가 AddLast 해주면 뒤에 붙는다.

 

First와 Last가 어딘가에 항상 있다는 의미가 된다. for문 돌려서 지울 때 중간에서 시작하거나 할 수는 없다.

 

RemoveFirst(); RemoveLast(); // 각각 첫 번째 거 마지막 거를 지우는 함수.

AddAfter() / AddBefore() 순회하다가 

 

LinkedListNode<int> Curnode = List1.First; 이러면 처음부터 돌겠다.

Cur = Cur.Next;

 

List1.AddAfter(Cur, 999); 이런 식으로 Cur 다음에 999가 들어간다.

Clear(); -> 전부 다 지워라 라는 의미. List에서도 LinkedList에서도 똑같이 Clear다.

 

자료구조에 가까운 컨텐츠다. 그러면 Clear로 통일성을 주어서 삭제할 때 다른 사람들이 활용하기 쉽게.

 

LinkedList(본체): 노드들을 관리해 주는 애(First & Last) / LinkedListNode:노드의 사이사이를 타고다니는 클래스. (순회를 돌기 위해서 사용)

 

그림을 그려가면서 해야 한다. 보통 노드는 게임 맵에서 많이 사용한다. 메모리가 허용하는 만큼 다른 지역과도 연결될 수 있다.

사냥터 연결의 예 노드의 실전적인 사용법.

 

Console.ReadKey();

 

자료구조가 중요한 이유: 기획자가 연결된 숫자가 바뀌었다고 하거나 할 수 있음. 처음에는 모든 미래를 예상하지 못한다.