자료구조

리스트

테오구 2021. 10. 17. 15:49
728x90

리스트의 구조

Stack, Queue, Deque과의 비교

공통점: 선형 자료구조

차이점: 자료의 접근 위치

리스트의 연산

  • 기본 연산
    • 리스트의 어떤 위치에 새로운 요소를 삽입한다.
    • 리스트의 어떤 위치에 있는 요소를 삭제한다.
    • 리스트의 어떤 위치에 있는 요소를 반환한다.
    • 리스트가 비었는지를 살핀다.
    • 리스트가 가득 차있는지를 체크한다.
  • 고급 연산
    • 리스트에 어떤 요소가 있는지를 살핀다.
    • 리스트의 어떤 위치에 있는 요소를 새로운 요소로 대치한다.
    • 리스트 안의 요소의 개수를 센다.
    • 리스트 안의 모든 요소를 출력한다.

리스트 ADT

데이터: 임의의 접근 방법을 제공하는 같은 타입 요소들의 순서 있는 모임
연산:
▪ insert(pos, item): 리스트의 pos 위치에 새로운 요소 item을 삽입한다.
▪ remove(pos): 리스트의 pos 위치에 있는 요소를 삭제한다.
▪ getEntry(pos): 리스트의 pos 위치에 있는 요소를 반환한다.
▪ isEmpty(): 리스트가 비어있는지를 검사한다.
▪ isFull(): 리스트가 가득 차 있는지를 검사한다.
▪ find(item): 리스트에 요소 item이 있는지를 살핀다.
▪ replace(pos, item): pos 위치에 있는 요소를 새로운 요소 item으로 바꾼다.
▪ size(): 리스트 안의 요소의 개수를 반환한다.
▪ display(): 리스트 안의 모든 요소들을 출력한다.

 

리스트 구현 방법

  • 배열을 이용
    • 구현이 간단
    • 삽입, 삭제 시 오버헤드
    • 항목의 개수 제한
  • 연결리스트를 이용
    • 구현이 복잡
    • 삽입, 삭제가효율적
    • 크기가 제한되지 않음

공백상태 / 포화상태

주요 연산

  • 삽입연산
    • 삽입위치 다음의 항목들을 이동하여야 함.
  • 삭제연산
    • 삭제위치 다음의 항목들을 이동하여야 함

연결 리스트로 구현한 리스트

  • 단순 연결 리스트(simply linked list) 사용
    • 하나의 링크 필드를 이용하여 연결
    • 마지막 노드의 링크 값은 NULL

리스트의 삽입 연산

더보기

insert(before, node)

 

if isEmpty()

  then head <- node

  else node.link <- before.link

        before.link  <- node

리스트의 삽입 삭제

더보기

remove(before)

 

if isEmpty() = false

  then  removed <- before.link

          before.link ← removed.link

          destroy(removed)

헤드 포인터와 헤드 노드

헤드 노드: 포인터 변수가 아니라 Node 객체

맨 앞 노드의 삽입이나 삭제 연산을 단순화할 수 있음

단순리스트를 이용한 구현

단순연결리스트 vs. 이중 연결 리스트

  • 단순연결리스트
    • 후속 노드는 쉽게 알 수 있다.(링크 필드)
    • 선행 노드를 알 수는 없을까?
    • 헤드포인터에서부터 리스트 항목들 탐색 필요
  • 이중연결리스트(doubly linked list)
    • 특정노드에서 양방향으로 자유롭게 움직일 필요가 있을 때 이중연결리스트를 사용
    • 공간을 더 많이 차지하고 코드가 복잡해 짐

이중 연결 리스트

728x90

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

병합정렬(mergeSort)  (0) 2022.04.21
  (0) 2021.10.17
재귀함수  (0) 2021.10.07
자료구조(그래프)  (0) 2021.09.11
자료구조(큐, 트리, 해시 테이블)  (0) 2021.09.06