1. 리스트(List)
- 리스트(List)
-
순서/위치를 갖는 자료들이 차례대로 나열된 선형 자료구조
-
-
집합(Set)과의 차이: 항목 간의 중복을 허용하며, 순서의 개념이 있다.
-
예시: 핸드폰 문자 메시지 리스트, 다항식의 각 항 등
-
1.1. 추상 자료형
-
데이터
- 같은 유형의 요소들의 순서 있는 모임
-
연산
insert(pos, e): pos 위치에 요소 e 삽입delete(pos): pos 위치의 요소 삭제 및 반환is_empty(),is_full(): 리스트의 공백/포화 상태 검사get_entry(pos): pos 위치의 요소 반환
2. 연결 리스트(Linked List)
2.1. Time Complexity
- Search: (Linear Search)
- Insert/Delete: 임의 위치에 대하여
2.2. Features
- 메모리 비연속적 저장 (각 노드가 다음 노드 주소를 저장)
- → 인덱스 접근 불가 (Sequential Access)
- → 삽입/삭제가 빠름 (노드 포인터만 수정)
- → 링크 필드 저장으로 인한 메모리 오버헤드
- 동적 크기 할당 (필요에 따라 크기 변화 가능)
2.3. Applications
- Stack, Queue, Deque, Tree, Graph 등 자료구조 구현
- 빈번한 삽입/삭제가 필요한 데이터 (실시간 데이터 처리 등)
- Hash Table에서 Chaining 방식의 Collision 처리에 사용
3. 교재에서 소개된 리스트
-
배열 구조의 리스트
- 요소의 수를 별도로 저장
- 삽입/삭제 시 요소 밀기/당기기 필요
-
단순 연결된 리스트
- 자기참조 구조체(링크 필드) 및 헤드 포인터 사용
- 삽입/삭제 시 링크 필드를 수정
-
이중 연결된 리스트
- 선행 노드와 후속 노드를 가리키는 링크 필드 사용
- 헤드 포인터 외에도 헤드 노드(dummy node)를 사용할 수 있다.
-
이중 연결된 덱
- 이중 연결된 리스트에서 헤드 포인터와 테일 포인터를 함께 사용
3.1. 배열을 이용한 리스트
-
구조
- 고정된 크기의 배열(
data[MAX_SIZE])과 현재 요소의 수(size)를 이용
- 고정된 크기의 배열(
-
특징 및 시간 복잡도
- 접근(
get_entry): 인덱스로 직접 접근하므로 로 매우 빠름 - 삽입(
insert): 중간에 삽입 시 뒤의 요소들을 한 칸씩 뒤로 밀어야 하므로 - 삭제(
delete): 중간 요소 삭제 시 뒤의 요소들을 한 칸씩 당겨야 하므로
- 접근(
-
Lab. 추가 연산
append(맨 뒤 추가),pop(맨 뒤 삭제),replace(수정),find(검색)
3.2. 단순 연결 구조의 리스트
-
구조
- 노드(Node): 데이터(
data)와 다음 노드를 가리키는 포인터(link)로 구성 - 헤드 포인터(Head Pointer): 리스트의 첫 번째 노드를 가리키는 포인터
- 노드(Node): 데이터(
-
특징 및 시간 복잡도
- 탐색(
get_node)- 앞에서부터 순차적으로 찾아야 하므로
- 삽입/삭제
- 물리적인 데이터 이동 없이 포인터만 변경하면 됨
- 삽입/삭제할 위치의 선행 노드(
before)를 알고 있다면 - 그렇지 않다면 위치를 찾는 과정 때문에
- 탐색(
-
헤드 노드(Head Node)
- 실제 데이터를 담지 않고 시작 위치만 표시하는 더미 노드
- 첫 번째 노드 삽입/삭제 시의 예외 처리를 없애고 코드를 단순화하기 위해 사용
-
Lab. 추가 연산
- 배열 리스트와 동일한 추가 연산(
append,pop,replace,find) 구현
- 배열 리스트와 동일한 추가 연산(
3.3. 이중 연결 구조의 리스트
-
구조
- 단순 연결 리스트의 단점(선행 노드 찾기 어려움)을 보완
- 노드 구조:
prev(이전 노드 포인터) +data+next(다음 노드 포인터)
-
특징
- 양방향 탐색이 가능하여, 특정 노드만 알면 삭제나 이전 위치 삽입이 에 가능
-
Lab. 덱(Deque) 연산
- 후단 삭제(
delete_rear):tail포인터가 없어도prev를 이용해 마지막 노드의 이전을 바로 찾을 수 있어 로 구현 가능
- 후단 삭제(
4. 요약
| 특징 | 배열 리스트 (Array List) | 연결 리스트 (Linked List) |
|---|---|---|
| 데이터 접근 | 빠름 (, 인덱스) | 느림 (, 순차 탐색) |
| 삽입/삭제 | 느림 (, 데이터 이동 필요) | 빠름 (, 위치를 알 경우) |
| 구조적 특징 | 크기가 고정됨 (일반적) | 크기가 동적으로 변함 |
| 용도 | 데이터 조회 빈번, 크기 고정 | 삽입/삭제 빈번, 크기 가변 |