c언어

연결 리스트의 개념과 동작 원리, 장단점과 구현 방법

차리남 2023. 7. 1. 11:34

연결 리스트의 개념과 동작 원리

 

연결 리스트는  데이터 요소가 연결된 데이터 구조로, 각 요소는 데이터와 다음 요소를 가리키는 링크(포인터)로 구성됩니다. 연결 목록에는 각 요소를 메모리에서 연속적으로 저장하여 동적으로 크기를 조정할 수 있는 장점이 있습니다.
연결된 목록의 개념과 원칙을 자세히 살펴보겠습니다:
노드 : 연결 목록의 각 요소를 노드라고 합니다.
각 노드는 데이터 필드와 링크 필드로 구성됩니다.
데이터 필드는 노드가 저장하는 데이터를 나타냅니다.
링크 필드는 다음 요소에 대한 포인터이며 일반적으로 "다음" 또는 "링크"라는 이름을 사용합니다.
머리 : 연결 목록의 첫 번째 노드를 가리키는 포인터입니다.
헤드는 연결 목록에 액세스하기 위한 시작점 역할을 합니다.
단일 연결 목록 : 각 노드는 다음 노드를 가리키는 링크 필드만 있는 연결 목록입니다.
마지막 노드의 링크 필드는 일반적으로 NULL 또는 Nullptr로 설정됩니다.
이중 링크 목록 : 각 노드는 이전 노드와 다음 노드를 가리키는 링크 필드가 모두 있는 연결 목록입니다.
이전 노드를 가리키는 링크 필드는 pprev」 또는 pprevLink」와 같은 이름으로 표시됩니다.
연결 목록의 작동 방식 : 연결 목록은 메모리로부터 독립적으로 요소를 저장하고 각 노드에는 다음 요소를 가리키는 데이터와 링크가 있습니다. 연결 목록의 첫 번째 노드를 가리키는 머리글을 사용하여 연결 목록에 액세스합니다.
요소 삽입 : 이전 노드와 삽입할 새 노드를 연결하고, 이전 노드 링크를 새 노드에 연결합니다.
요소 삭제—삭제할 노드의 이전 노드를 다음 노드에 직접 연결하여 노드를 건너뜁니다.

 


연결 리스트의 삽입과 삭제 연산

 

연결 리스트 내 삽입 및 삭제 작업은 중요한 조작 중 하나입니다. 링크 목록에는 요소 삽입 및 삭제를 효율적으로 처리할 수 있다는 이점이 있습니다. 이하, 접속 리스트의 삽입과 삭제의 조작에 대해 자세하게 설명합니다.

삽입 연산 : 특정 위치에 새로운 요소를 삽입하는 작업입니다. 보통 다음 세 가지 순서로 실행됩니다: 삽입할 위치에서 이전 노드를 찾습니다. 새 노드를 만들고 데이터를 설정합니다. 새 노드를 오래된 노드의 다음 노드에 링크하고 오래된 노드를 새 노드에 링크합니다.
삭제 연산 : 어소시에이션 목록에서 특정 요소를 삭제하는 작업입니다.
보통 다음 세 가지 순서로 실행됩니다. 제할 요소를 찾습니다. 삭제할 요소의 이전 노드와 다음 노드를 직접 연결하여 해당 요소를 건너뜁니다. 삭제할 요소의 메모리를 해방합니다. 삽입 및 삭제 작업의 예입니다.

삽입 및 삭제 작업은 일반적으로 O(1)의 시간 복잡도를 가집니다. 이는 오래된 노드와 새 노드 간 또는 오래된 노드와 다음 노드 간의 링크만 변경해야 하기 때문입니다.
단, 특정 위치를 삽입하거나 삭제하면 해당 위치를 특정하는 데 추가로 O(n) 시간이 걸립니다.
 
연결 리스트의 검색과 탐색:연결된 목록의 검색 및 통과 작업은 연결된 목록에서 특정 요소를 찾거나 전체 목록을 탐색하는 작업입니다. 다음은 연락처 목록의 검색 및 탐색에 대한 자세한 설명입니다.

검색 작업:연결 목록에서 특정 값을 가진 요소를 찾는 작업입니다.일반적으로 이 작업은 다음 단계에 따라 수행됩니다. 연결 목록의 첫 번째 노드로 시작합니다. 각 노드의 데이터 필드를 스캔하여 찾으려는 값을 비교합니다. 값이 일치하는 노드가 발견되면 검색을 종료하고 노드를 반환합니다. 연결 목록을 검색했지만 일치하는 값을 가진 노드를 찾을 수 없는 경우 검색 실패로 간주합니다.

 

 

연결 리스트의 장단점과 활용 사례

 

이점 : 동적 크기—연결 목록의 크기를 동적으로 조정할 수 있습니다. 새로운 요소는 삽입 및 제거가 쉽고 메모리를 효율적으로 사용할 수 있습니다. 삽입 및 삭제 작업의 효율성: 요소 삽입 및 삭제는 정해진 시간 내에 가능합니다(O(1)). 이 작업은 단순 연결 목록에서 노드를 조정하여 수행합니다. 메모리 요구 감소: 요소가 노드로 구성되어 있으므로 연결 목록에는 데이터 및 링크 필드만 있습니다. 따라서 어레이에 비해 메모리 요구사항이 상대적으로 작습니다.
단점: 랜덤 액세스의 어려움: 연결 목록은 특정 위치에 직접 액세스하기 어렵습니다. 검색은 원하는 위치를 찾기 위해 처음부터 순환해야 하므로 비효율적입니다. 이는 O(1)에서 랜덤 액세스가 가능한 어레이의 이점과는 대조적입니다.
추가 메모리 사용: 연결 목록은 링크 필드를 통해 다음 노드의 주소를 가리키기 때문에 어레이에 비해 추가 메모리를 사용합니다. 즉, 포인터를 저장할 공간이 필요합니다. 순차적 액세스의 필요성: 연결된 목록은 요소에 순차적으로 액세스해야 합니다. 즉, 연속 메모리 공간에 저장된 데이터가 있는 어레이에 비해 캐시 인접성이 활용되지 않습니다.

사용 사례:  동적 데이터 구조: 연결 목록은 동적으로 변경되는 데이터를 저장하는 데 사용됩니다. 예를 들어 스택 및 대기열을 연결 목록으로 구현할 수 있습니다. 메모리 관리: 연결 목록은 메모리 할당 및 폐기를 효율적으로 관리하는 데 도움이 됩니다. 동적 메모리 할당 및 해제가 필요할 때 사용됩니다. 대량의 데이터 처리: 연결 목록은 대량의 데이터를 처리할 때 제한된 메모리 상황에서 유용할 수 있습니다. 필요한 데이터에 액세스하고 처리할 수 있도록 대량의 데이터를 연결된 목록으로 구성합니다.

 

 

연결 리스트의 구현과 시간 복잡도 분석:

 

연결 목록 구현: 연결 목록은 데이터 필드와 다음 노드를 가리키는 링크(포인터) 필드로 구성된 노드로 구성됩니다. 기본 노드 데이터 필드에는 실제 데이터가 저장되고 링크 필드에는 다음 노드의 주소가 저장됩니다.
링크 목록 구현에는 두 가지 일반적인 유형이 있습니다:

단일 링크 목록:각 노드가 다음 노드를 가리키는 데이터 필드와 링크 필드로 구성된 구조입니다.
Head 노드를 사용하여 목록의 시작점을 지정합니다.
마지막 노드의 링크 필드가 NULL 또는 None으로 나타납니다.
이중 링크 목록: 각 노드가 데이터 필드, 이전 노드를 가리키는 링크 필드 및 다음 노드를 가리키는 링크 필드로 구성된 구조입니다.단일 연결 목록과 달리 양방향 탐색을 위해 이전 노드를 가리키는 링크 필드가 추가됩니다.
Head 및 Tail 노드를 사용하여 목록의 시작점과 끝점을 지정합니다.
시간 복잡도 분석: 연결 목록의 기본 작업(삽입, 삭제, 검색 및 탐색)은 다음과 같습니다:
삽입: 특정 위치에 노드를 삽입하는 작업입니다. 단일 연결 목록은 삽입할 위치를 찾는 데 평균 O(n) 시간이 걸립니다.
이중 연결 목록의 경우 삽입할 위치를 찾는 데 평균 O(n) 시간이 걸립니다. 삽입 동작 자체는 정해진 시간(O(1))에 실행됩니다.
삭제 : 특정 위치의 노드를 삭제하는 작업입니다. 단일 연결 목록의 경우 삭제할 위치를 찾는 데 평균 O(n) 시간이 걸립니다. 이중 연결 목록의 경우 삭제할 위치를 찾는 데 평균 O(n)시간이 걸립니다.