컴퓨터에 데이터를 저장하는 방법에는 크게 2가지가 있다.
첫 번째 경우는 우리가 일반적으로 아는 배열이고, 두 번째 경우가 Linked List(연결리스트)에 해당된다.
비유를 하자면 다음과 같이 다르다.
👉예시
A라는 수업 분반에 강의실 공간이 할당됨
- 배열 : 학생 인원 예측해 책상 50개를 미리 넣어놓는다. (정확한 인원을 모르기 때문에 안쓰는 책상이 있을 수 있음)
- 연결리스트 : 학생이 직접 책상을 받아 가지고 강의실로 들어간다. 단, 바로 전 학생이 다음 학생의 위치를 기억하도록 한다. (낭비되는 책상 없음)
👉배열의 장점
- 접근이 빠르다.
👉배열의 단점
- 메모리 사용이 효율적이지 않다.
- 배열 내의 데이터 이동이 어렵다.
👉연결리스트의 장점
- 동적 메모리를 사용하므로 메모리 관리에 효율적이다.
- 데이터 재구성이 간단한 편이다.
👉연결리스트의 단점
- 어느 특정 위치에 존재하는 데이터를 찾는데 느리다.
- 주소를 저장하는 메모리를 추가로 사용해야 한다.
연결리스트는 기본적으로 노드라고 부르는 객체로 이루어져 있다.
그럼 노드가 뭐지? 노드는 블럭 2개로 이루어진 객체라고 할 수 있다. 앞쪽에는
값이 들어가게 되고(element field), 뒤쪽 블럭에는 다음 노드의 위치를 가리키는 주소값이 들어가게 된다.(Link field)
그림과 같이 연결 리스트는 노드들이 선형적으로 순서화된 형태의 집합체라 할 수 있다.
이 노드에서 링크필드가 1개만 있으면 단일 연결리스트, 2개면 이중 연결리스트라고 부른다.
단일 연결 리스트에서 값을 삽입(insert)하거나 삭제(delete)하는 방법은 간단히 정리하면 아래와 같다.
=> 단일 연결리스트에서의 이 방법은 구현은 가능하나 효율적이지는 않다.
=> 이중 연결리스트에서는 쉽게 구현이 가능하다. (이중 연결리스트는 다음 노드의 주소뿐만 아니라 이전 노드의 주소도 가지고 있기 때문.)
우선 기본적으로 데이터 필드와 주소값 필드로 이루어져 있는 노드를 구현해야 한다. 구조체를 이용해 구현할 수도 있지만 C++을 주로 사용하기 때문에 Node class로 구현하겠다.
기본적으로 있어야 할 자료구조의 기능으로는 탐색과 삽입(저장), 삭제가 있다. 이를 위해 순차적으로 연결리스트에 값을 추가하는 기능과, 원하는 위치에 접근해 값을 넣는 기능, 원하는 위치에 접근해 값을 삭제하는 기능들이 있어야 할 것이다. 이를 위해 구현할 기본 연산은 다음과 같다.
정수 값을 담을 수 있는 Singly Linked List의 예시 구현 코드는 다음과 같다.