C#/구문

[ C# ] 리스트(List)

진명_Kim 2024. 3. 13. 18:12

Index 번호로 접근할 수 있는 강력한 형식의 개체 목록.

동적 배열의 형태를 띄고 있어 데이터가 삽입/감소되면 자동으로 용량을 증감한다.

(크기는 자동적으로 2배씩 증가된다.)

 

C++의 리스트와는 다른 구조를 가지고 있다.

 

C++ List : 

Double Linked List 형식

양방향 노드 기반의 데이터 연결 구조이다.

[노드] 

 

[구성 형식] 

 

[삭제]

값이 제거되면 이전 노드의 [다음 노드를 가리키는 포인터]가 다음 노드의 [이전 노드를 가리키는 포인터]와 연결된다.

[삽입]

값이 추가되면 추가되는 노드의 [이전 노드를 가리키는 포인터]는 이전 노드와,

[다음 노드를 가리키는 포인터]는 다음 노드와 연결된다.

장점 : 요소의 삽입/ 제거가 빠르다.

단점 : 양방향으로 연결되어 있어 탐색이 느리다.

 

C# List

동적 배열 기반의 데이터 연결 구조.

단방향 연결 리스트(singly Linked List), 양방향 연결 리스트(double Linked List), 순환형 연결 리스트(Circle Linked List) 모두 사용할 수 있다.

 

양방향은 위에서 설명한 것과 동일함으로 넘어간다.

 

단방향 연결 리스트(singly Linked List)

[노드]

 

[구성 방식]

[삭제]

값이 제거되면 다음 노드들이 빈 공간만큼 앞으로 이동된다.

 

[삽입]

값이 삽입되면 삽입되는 양만큼 다음 노드들이 뒤로 이동한다.

 

순환 연결 리스트(Circle Linked List)

 


LinkedList

데이터를 포함하는 노드들을 연결식으로 만든 구조.

데이터와 다른 데이터 지점의 참조변수르 가진 노드를 기본 단위로 사용.

 

선언

LinkedList<데이터타입> 리스트명 = new LinkedList<데이터타입>(초기값);

 

사용 예시

static void Main()
{
    //1. LinkedList 선언
    LinkedList<string> linkedlist = new LinkedList<string>();

    linkedlist.AddLast("ss");
    //해당 형식으로 삽입하는 것도 가능하다.
    
    //2. LinkedList에 넣을 LinkedListNode들을 생성
    LinkedListNode<string> node0 = linkedlist.AddFirst("0번 데이터");
    LinkedListNode<string> node1 = linkedlist.AddFirst("1번 데이터");
    // .AddFirst : 가장 앞에 삽입
    // node1이 가장 앞에 있다.

    LinkedListNode<string> node2 = linkedlist.AddLast("2번 데이터");
    LinkedListNode<string> node3 = linkedlist.AddLast("3번 데이터");
    // .AddLast : 가장 마지막에 삽입
    // node3이 가장 뒤에 있다.

    LinkedListNode<string> node4 = linkedlist.AddBefore(node0, "4번 데이터");
    // .AddBefore : 지정한 노드의 앞에 삽입

    LinkedListNode<string> node5 = linkedlist.AddAfter(node0, "5번 데이터");
    // .AddBefore : 지정한 노드의 뒤에 삽입

    foreach (var item in linkedlist)
    {
        Console.Write(item + "-> ");
    }

    linkedlist.Remove("1번 데이터");
    //입력한 데이터를 가진 요소 삭제
    linkedlist.Remove(node3);
    //지정한 노드의 요소 삭제
    linkedlist.RemoveFirst();
    //가장 앞에 있는 요소 삭제
    linkedlist.RemoveLast();
    //가장 뒤에 있는 요소 삭제

    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine();

    foreach (var item in linkedlist)
    {
        Console.Write(item + "-> ");
    }

    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine();

    LinkedListNode<string> firstNode = linkedlist.First;
    LinkedListNode<string> LastNode = linkedlist.Last;
    LinkedListNode<string> preNode = node0.Previous;
    LinkedListNode<string> NextNode = node0.Next;
    //접근 방식

    Console.WriteLine(firstNode.Value);
    Console.WriteLine(LastNode.Value);
    //Console.WriteLine(preNode.Value);
    //이전 노드가 존재하지 않아 오류 발생
    // Console.WriteLine(NextNode.Value);

    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine();

    LinkedListNode<string> findNode = linkedlist.Find("5번 데이터");
    //탐색
    Console.WriteLine(findNode.Value);

}

 

LinkedList 메서드

 

.AddFirst : 맨 앞에 요소를 추가

.AddLast : 맨 뒤에 요소를 추가

.AddBefore : 지정된 노드 앞에 요소를 추가

.AddAfter : 지정된 노드 뒤에 요소를 추가

.Remove : 첫번째 요소 삭제

.RemoveFirst : 리스트의 첫번째 요소 삭제

.RemoveLast : 리스트의 마지막 요소 삭제

.Find : 지정한 값을 가진 첫번째 요소의 노드 반환

.Clear : 리스트의 모든 요소 삭제

.Count : 리스트에 포함된 모든 요소의 수 반환