자료구조
[10] 연결 리스트(linked list)
지식보부상님
2021. 1. 11. 22:15
배열의 큰 단점이 중간에 원소를 삽입하려면 cost가 매우 크다는 것이다.
중간에 자리를 만들기 위해서 나머지를 오른쪽으로 모두 옮겨야 한다.
같은 맥락으로 중간의 원소를 삭제할 때
원소를 삭제한 후 나머지 원소들을 모두 왼쪽으로 옮겨야 해서 cost가 크다는 단점이 있다.
연결 리스트(linked list)를 사용하면 이러한 문제들을 어느정도 해결할 수 있다.
linked list는 다음과 같이 정의한다.
1
2
3
4
5
6
|
typedef struct _listNode {
int data;
// 여러 요소들
struct _listNode* link;
}listNode;
typedef listNode *listPointer;
|
cs |
예시 프로그램을 만들어보자.
다음과 같이 연결하기 위해서는 다음과 같이 프로그램을 작성하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
int main() {
listPointer A, B;
A = (listPointer)malloc(sizeof(listNode));
B = (listPointer)malloc(sizeof(listNode));
A->data = 10;
A->link = B;
B->data = 20;
B->link = NULL;
return 0;
}
|
cs |
만약 A와 B 노드 사이에 C 노드를 삽입하고 싶으면 어떻게 하면 될까?
다음과 같이 A와 B의 연결을 끊고 A는 C를, C는 B를 가리키도록 해야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
int main() {
listPointer A, B;
A = (listPointer)malloc(sizeof(listNode));
B = (listPointer)malloc(sizeof(listNode));
A->data = 10;
A->link = B;
B->data = 20;
B->link = NULL;
listPointer C;
C = (listPointer)malloc(sizeof(listNode));
C->data = 15;
C->link = NULL;
A->link = C;
C->link = B;
return 0;
}
|
cs |
그렇다면 이번엔 가운데 있는 노드 C를 삭제해보자.
A가 B를 가리키게 하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
int main() {
listPointer A, B, C;
A = (listPointer)malloc(sizeof(listNode));
B = (listPointer)malloc(sizeof(listNode));
C = (listPointer)malloc(sizeof(listNode));
A->data = 10;
B->data = 20;
C->data = 15;
A->link = C;
C->link = B;
B->link = NULL;
// A와 B 연결
A->link = C->link;
// C는 삭제하므로 꼭 free해준다.
free(C);
return 0;
}
|
cs |