자료구조&알고리즘

연결 리스트

CalebHong 2022. 2. 18. 12:05

연결 자료구조

1. 순차 자료구조의 문제점

- 문제점

 1) 삽입 연산이나 삭제 연산 후에 연속적인 물리 주소를 유지하기 위해서 원소들을 이동시키는 추가적인 작업과 시간 소요

* 원소의 개수가 많을수록 원소들이 이동 작업으로 인한 오버 헤드가 많음

 * 삽입, 삭제, 연산이 많이 발생하는 경우에 성능 상의 문제 발생

 

 2) 순차 자료구조는 배열을 이용하여 구현하기 때문에 배열이 갖고 있는 메모리 사용의 비효율성 문제를 그대로 가짐

 

2. 연결 자료구조의 정의

- 연결 자료구조(Linked Data Structure)

  : 자료의 논리적인 순서와 물리적인 순서가 일치하지 않는 자료구조

 * 각 원소에 저장되어 있는 다음 원소의 주소(Pointer)에 의해 순서가 연결되는 방식

 -> 물리적인 순서를 맞추기 위한 오버 헤드가 발생하지 않음

 * 여러 개의 작은 공간을 연결하여 하나의 전체 자료구조를 표현

 -> 크기 변결이 유연하고, 더 효율적으로 메모리를 사용

 

- 연결 리스트

 * 리스트를 연결 자료구조로 표현한 구조

 

- 연결 리스트의 노드

 * <원소, 주소>의 구조

3. 연결 자료구조의 이해

- 노드 연결 방법에 대한 이해(기차놀이)

 * 기차놀이 하는 아이들: 연결 리스트의 노드

 * 이름표: 노드의 링크 필드

 

- 선형 리스트와 연결 리스트의 비교

 * 선형 리스트 논리 구조

 * 연결 리스트의 논리 구조

▪ 리스트 이름 week: 연결 리스트의 시작을 가리키는 포인터 변수
- 포인터 변수 week는 연결 리스트의 첫 번째 노드를 가리키는 동시에 연결된 리스트 전체를 의미
▪ 연결 리스트의 마지막 노드의 링크 필드: 노드의 끝을 표시하기 위해서 null 저장
▪ 공백 연결 리스트: 포인터 변수 week에 null을 저장(널 포인터)

 * 구조체 정의

typedef struct Node{ 
	char data[4]; 
	struct Node* link; 
};

 

단순 연결 리스트

1. 단순 연결 리스트의 정의

- 단순 연결 리스트(Singly Linked List)

▪ 노드 하나의 링크 필드에 의해서 다음 노드와 연결되는 구조를 가진 연결 리스트

 

1. 단순 연결 리스트의 삽입

▪ 예제 1) 리스트 week2 = (월, 금, 일) 에서 원소 "월"과 "금" 사이에 새 원소 "수" 삽입하기

 1) 삽입할 새 노드를 만들 공백 노드를 메모리에서 가져와서 포인터 변수 enw가 가리키게 함

 2) new의 데이터 필드에 “수”를 저장함

 3) new의 앞 노드, 즉 “월” 노드의 링크 필드값을 new의 링크 필드에 저장함

 4) new의 값(new가 가리키고 있는 새 노드의 주소)을 “월” 노드의 링크 필드에 저장함

3. 단순 연결 리스트의 삭제

- 예제 2) 리스트 week2 = (월, 수, 금, 일) 에서 원소 "수" 삭제하기

 1) 삭제할 원소의 앞 노드(선행자)를 찾음

 2) 삭제할 원소 “수”의 링크 필드 값을 앞 노드의 링크 필드에 저장함

- 자유 공간 리스트(Free Space Lise)

 ▪ 사용하기 전의 메모리나 사용이 끝난 메모리를 관리의 용이성을 위해 노드로 구성하여 연결한 리스트

- 자유 공간 리스트에서의 노드 할당 과정

 ▪ 자유 공간 리스트 Free에서 노드를 할당할 때는 항상 첫 번째 노드 할당

 1) new ← Free;

  - 리스트 Free의 첫 번째 노드의 주소(Free)를 포인터 new에 저장하여 포인터 new가 할당 할 노드를 가리키게 함

 2) Free ← Free.link;

 - 포인터 Free에 리스트의 두 번째 노드의 주소(Free.link)를 저장

 - 이제 자유 공간 리스트 Free의 첫 번째 노드는 리스트에서 의미적으로 분리된 상태이므로 포인터 new를 반환(return new;)해 줌으로써 새 노드를 할당

 

'자료구조&알고리즘' 카테고리의 다른 글

스택의 구현  (0) 2022.02.22
스택(Stack)  (0) 2022.02.22
리스트와 단순 연결 리스트  (0) 2022.02.15
선형 리스트의 구현  (0) 2022.02.14
선형 리스트(Lenear List) 개요  (0) 2022.02.14