자료구조&알고리즘

리스트와 단순 연결 리스트

CalebHong 2022. 2. 15. 12:35

연결 리스트

1. 연결 리스트란?

 * 리스트의 목록을 순서대로 연결한 것

 

2. 연결 리스트의 기초

typedef struct 
{ 
    int Data; //노드 내부의 실제 데이터 또는 레코드
    node* Next; //Next가 가리키는 것은 노드 타입
} node; //구조체에 노드라는 새로운 타입명 부여

typedef node* Nptr; //Nptr 타입이 가리키는 것은 노드 타입

Nptr p, q; //Nptr 타입 변수 p, q를 선언

 - 노드 이어붙이기

p = (node *)malloc(sizeof(node));
p->Data = 33;
p->Next = (node *)malloc(sizeof(node)); 
p->Next->Data = 22; 
p->Next->Next = NULL;

3. 출력, 삽입, 삭제

 1) 출력

Temp = Head; 
while (Temp != NULL) 
{ 
    printf("%d ", Temp->Data); 
    Temp = Temp->Next; 
}

 

 2) 삽입

p = (node *)malloc(sizeof(node)); 
p->Data = 8;
p->Next = Temp->Next;
Temp->Next = p;

 

 3) 삭제

p = Temp->Next; 
Temp->Next = Temp->Next->Next; 
free p;

여러 가지 연결 리스트

1. 이중 연결 리스트

- 삽입과 삭제

 * 단순 연결 리스트의 삽입

 * 테일 포인터가 따로 있으면 유리

 * 삭제일 경우에는 테일 포인터가 뒤로 이동

 * 이중 연결이어야 테일 포인터를 뒤로 이동할 수 있음

2. 원형 연결과 원형 이중 연결

1) 원형 연결

 * 타임 셰어링 시스템의 타임 슬라이스(cf. 멀티 프로스세 환경에서 CPU가 TASK를 분배)

 * 사용자 교대

2) 원형 이중 연결

 * 접근성이 좋아지지만, 값이 비싸다.

 * 중간 사슬이 끊어지면 전체적으로 구조가 무너지기 쉽다.

 

3. 배열과 원형 리스트의 비교

- 공간

  ▪ 배열은 정적이므로 최대크기를 미리 예상해야 함

  ▪ 만들어 놓은 배열 공간이 실제로 쓰이지 않으면 낭비

  ▪ 연결 리스트는 실행 시 필요에 따라 새로운 노드 생성

  ▪ 연결 리스트는 포인터 변수공간을 요함

 

- 검색 시간

  ▪ 배열은 단번에 찾아감(묵시적 어드레싱: 인덱스 연산)

  ▪ 연결 리스트는 헤드부터 포인터를 따라감(현시적 어드레싱: 포인터 읽음)

 

- 삽입, 삭제 시간

  ▪ 배열의 삽입: 오른쪽 밀림(Shift Right)

  ▪ 배열의 삭제: 왼쪽 밀림(Shift Left)

  ▪ 연결 리스트: 인접 노드의 포인터만 변경

 

- 어떤 자료구조를 선택할 것인가?

  ▪ 검색 위주이면 배열이 유리

  ▪ 삽입 삭제 위주라면 연결 리스트가 유리

  ▪ 최대 데이터 수가 예측 불가라면 연결 리스트

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

스택(Stack)  (0) 2022.02.22
연결 리스트  (0) 2022.02.18
선형 리스트의 구현  (0) 2022.02.14
선형 리스트(Lenear List) 개요  (0) 2022.02.14
알고리즘 분석  (0) 2022.02.11