linked representation
๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ๋ณํ ์ ์๊ณ ์ญ์ ๋ ์ฝ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ํ ํ์๊ฐ ์๋ ์ฐ๊ฒฐ๋ ํํ
์ด ์ฐ๊ฒฐ๋ ํํ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์คํธ๋ค์ ์ฐ๊ฒฐ.
์ด๋ ํธ๋ฆฌ ๊ทธ๋ํ ์คํ ํ ๋ฑ์ ๊ตฌํํ๋๋ฐ๋ ๋ง์ด ์ฌ์ฉ๋๋ค.
linked list
๋ฌผ๋ฆฌ์ ์ผ๋ก ํฉ์ด์ ธ ์๋ ์๋ฃ๋ค์ ์๋ก ์ฐ๊ฒฐํ์ฌ ํ๋๋ก ๋ฌถ๋ ๋ฐฉ๋ฒ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ(linked list)๋ผ๊ณ ํ๋ค. ํด๋น์ฐ๊ฒฐ์ ํฌ์ธํฐ๋ฅผ ํ์ฉ
๊ธฐ์กด์ ๋ฐฐ์ด๋ก ๊ตฌ์ฑํ ๋ฆฌ์คํธ์ฒ๋ผ ๋ฐ์ดํฐ๋ค์ ์ฎ๊ธธ ํ์์์ด ํฌ์ธํฐ๋ฅผ ์์ ํ๋ฉด ๋๋ค.
์ฅ์ : ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ด ํ์ํ ๋๋ง๋ค ๋์ ์ผ๋ก ๊ณต๊ฐ์ ๋ง๋ค์ด์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋ค๋ ๊ฒ. ์ด๊ฒ์ ์์ฐจ์ ์ธ ํํ ๋ฐฉ๋ฒ์ ๋ฐฐ์ด์ ๋นํ์ฌ ์๋นํ ์ฅ์ .
๋จ์ : ๋ฐฐ์ด์ ๋นํ์ฌ ์๋์ ์ผ๋ก ๊ตฌํ์ด ์ด๋ ต๊ณ ์ค๋ฅ๊ฐ ๋๊ธฐ ์ฌ์ ๋ํ ๋ฐ์ดํฐ ๋ฟ๋ง ์๋๋ผ ํฌ์ธํฐ๋ ์ ์ฅํด์ผ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ง์ด ์ฌ์ฉ. ๋ i ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ผ๋ ค๋ฉด ์์์๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํด์ผํจ.
์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๊ตฌ์กฐ
์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๋ ธ๋(node)๋ค์ ์งํฉ. ๋ ธ๋๋ ๋ฐ์ดํฐํ๋(data field)์ ๋งํฌํ๋(link field)๋ก ๊ตฌ์ฑ๋์ด์๋ค.
[N] -> [data][link] ->
๋ฐ์ดํฐ ํ๋์๋ ์ฐ๋ฆฌ๊ฐ ์ ์ฅํ๊ณ ์ถ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ค. ๋งํฌํ๋์๋ ๋ค๋ฅธ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์ ์ฅ๋๋ค. ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ ๋ ธ๋๋ฅผ ์์์ผ ๋ง์ด ์ ์ฒด ๋ ธ๋์ ์ ๊ทผํ ์ ์๋ค. ๋ฐ๋ผ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ง๋ค ์ฒซ ๋ฒ์งธ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ณ์๊ฐ ํ์ํ๋ฐ ์ด๊ฒ์ ํค๋ ํฌ์ธํฐ(head ponter)๋ผ๊ณ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง ๋ ธ๋์ ๋งํฌํ๋๋ NULL๋ก ์ค์ ์ด๋ ๋ ์ด์ ์ฐ๊ฒฐ๋ ๋ ธ๋๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธ
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ข ๋ฅ
๋จ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ (singly linked list) :๋จ๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ. ์ฒด์ธ(chain)์ด๋ผ๊ณ ๋ ๋ถ๋ฆ. ๋จ์ ๋ฐฉํฅ์ผ๋ก๋ง ์ฐ๊ฒฐ๋์ด ์๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ์์ ๋ง๋๋ง ๋ ธ๋์ ๋งํฌ๋ NULL์ด๋ค.
์ด ์ธ์ ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ฑ์ด ์์ง๋ง ์ด๊ฑด ์ดํ์ ํฌ์คํ ์์ ๋ค๋ค๋ณด๋๋ก ํ๊ณ ์ค๋์ ๋จ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ํด์๋ง ๊ตฌํํด๋ณด๊ฒ ๋ค.
-๋ ธ๋๋ ์ด๋ป๊ฒ ์ ์ํ ๊ฒ์ธ๊ฐ? -> ์๊ธฐ ์ฐธ์กฐ ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์ฉํ๋ค.
-๋ ธ๋๋ ์ด๋ป๊ฒ ์์ฑํ ๊ฒ์ธ๊ฐ? -> malloc()์ ํธ์ถํ์ฌ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ก ์์ฑํ๋ค.
-๋ ธ๋๋ ์ด๋ป๊ฒ ์ญ์ ํ ๊ฒ์ธ๊ฐ? -> free()๋ฅผ ํธ์ถํ์ฌ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌํ
#include <stdio.h>
#include <stdlib.h>
//
typedef int element;
//
typedef struct ListNode { // ๋
ธ๋ ํ์
์ ๊ตฌ์กฐ์ฒด๋ก ์ ์ํ๋ค.
element data;
struct ListNode* link;
} ListNode;
//
ListNode* search_list(ListNode* head, element value) {
ListNode* p;
p = head;
while (p != NULL) {
if (p->data == value) {
return p;
}
p = p->link;
}
return NULL;
}
ListNode* insert_first(ListNode* head, int value)
{
ListNode* p = (ListNode*)malloc(sizeof(ListNode)); //(1)
p->data = value; //(2)
p->link = head; //(3)
head = p; //(4)
return head;
}
// ๋
ธ๋ pre ๋ค์ ์๋ก์ด ๋
ธ๋ ์ฝ์
ListNode* insert(ListNode* head, ListNode* pre, element value)
{
ListNode* p = (ListNode*)malloc(sizeof(ListNode)); //(1)
p->data = value; //(2)
p->link = pre->link; //(3)
pre->link = p; //(4)
return head; //(5)
}
//
ListNode* delete_first(ListNode* head)
{
ListNode* removed;
if (head == NULL) return NULL;
removed = head; // (1)
head = removed->link; // (2)
free(removed); // (3)
return head; // (4)
}
// pre๊ฐ ๊ฐ๋ฆฌํค๋ ๋
ธ๋์ ๋ค์ ๋
ธ๋๋ฅผ ์ญ์ ํ๋ค.
ListNode* delete_pre(ListNode* head, ListNode* pre)
{
ListNode* removed;
removed = pre->link;
pre->link = removed->link; // (2)
free(removed); // (3)
return head; // (4)
}
// linked list ์ถ๋ ฅํ๊ธฐ.
void print_list(ListNode* head)
{
for (ListNode* p = head; p != NULL; p = p->link)
printf("%d->", p->data);
printf("NULL \n");
}
// ํ
์คํธ ํ๋ก๊ทธ๋จ
int main(void)
{
ListNode* head = NULL; // lisked list ๋ฅผ ๊ฐ๋ฆฌํค๋ ํค๋ pointer.
ListNode* ptr = NULL;
// 1. ๋ฆฌ์คํธ ์์ฑ(10,20,30,40,50)
for (int i = 50; i >= 10; i -= 10) {
head = insert_first(head, i);
print_list(head);
}
// 2. 40 ์ฐพ๊ธฐ
ptr = search_list(head, 40);
// ๋ชป ์ฐพ์ ๊ฒฝ์ฐ : prt == NULL
// ์ฐพ์ ๊ฒฝ์ฐ : ptr != NULL
if (ptr != NULL) { printf("> ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ (%d)\n", ptr->data); }
else { printf("๋ฐ์ดํฐ๋ฅผ ๋ชป์ฐพ์ \n"); }
for (int i = 0; i < 5; i++) {
head = delete_first(head);
print_list(head);
}
return 0;
}
์ฝ์
์ฐ์ฐ insert_first()
๋จ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ ๋ฆฌ์คํธ์ ์ฒ์์ด๋ ๋์ ์๋ก์ด ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์.
ListNode * insert_first(ListNode *head, element value);
์๋ก์ด ๋ ธ๋๋ฅผ ํ๋ ์์ฑํ๊ณ ์๋ก์ด ๋ ธ๋์ link์ ํ์ฌ์ head ๊ฐ์ ์ ์ฅ ํ ํ์, head๋ฅผ ๋ณ๊ฒฝํ์ฌ ์๋ก์ด ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ฉด ๋๋ค. insert_fisrt()๋ ๋ณ๊ฒฝ๋ ํค๋ ํฌ์ธํฐ๋ฅผ ๋ฐํ. ๋ฐ๋ผ์ ๋ฐํ๋ ๊ฐ์ ํค๋ ํฌ์ธํฐ์ ์ ์ฅํด์ผํจ
์ฝ์ ์ฐ์ฐ insert(head, pre, value)
์ฐ๊ฒฐ๋ฆฌ์คํธ ์ค๊ฐ์ ์๋ก์ด ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ ๋ฉ์๋
1. ์๋ก์ด ๋ ธ๋๋ฅผ ์์ฑํ์ฌ ๋ณ์ p๋ก ๊ฐ๋ฆฌํจ๋ค.
2. p์ ๋ฐ์ดํฐ ํ๋์ value ๋ฅผ ์ ์ฅํ๋ค.
3. p์ ๋งํฌ ํ๋๊ฐ ๋ค์ ๋ ธ๋์ ๋ฐ์ดํฐ ํ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ณ๊ฒฝ
4. ํค๋๋ ธ๋์ ๋งํฌํ๋๊ฐ pre๋ ธ๋์ ๋ฐ์ดํฐํ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๋ค.
5. ๋ณ๊ฒฝ๋ ํค๋ ํฌ์ธํฐ ๋ฐํ
head -> [data][link] -> pre [data][link] -> p[data][link] -> ๋ค์ ๋ ธ๋
์ญ์ ์ฐ์ฐ delete(head,pre)
delete_first()๋ ํด๋น ์ค๋ช ์ ๋ค์ผ๋ฉด ์ดํด๊ฐ ๊ฐ๊ฒ์ด๋ค.
1. ์ญ์ ํ ๋ ธ๋๋ฅผ ์ฐพ๋๋ค.
2. pre ๊ฐ ๊ฐ๋ฆฌํค๋ ๋งํฌํ๋์ ์ญ์ ๋ ๋ ธ๋์ ๋งํฌํ๋๋ฅผ ๋ฃ๋๋ค(๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ)
3. ์ญ์ ํ ๋ ธ๋์ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ฉ
4. ๋ณ๊ฒฝ๋ ํค๋ ํฌ์ธํฐ๋ฅผ ๋ฐํ
๋ฐฉ๋ฌธ ์ฐ์ฐ print_list(ListNode *head)
๋ ธ๋์ ๋งํฌ๊ฐ์ด NULL์ด ์๋๋ฉด ๊ณ์ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ. ๋งํฌ๊ฐ์ด NULL์ด๋ฉด ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋์ ๋๋ฌํ ๊ฒ์ด๋ฏ๋ก ๋ฐ๋ณต์ ์ค๋จ.
'์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C์ธ์ด] ์ฐ๊ฒฐ๋ฆฌ์คํธ์์ ํน์ ํ ๊ฐ ํ์ํ๊ธฐ(๋ ธ๋ ํ์ ์๊ณ ๋ฆฌ์ฆ) (1) | 2020.11.06 |
---|---|
[C์ธ์ด] ๋จ์ด๋ค์ ์ ์ฅํ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ (0) | 2020.11.06 |
[C์ธ์ด] ๋ฐฐ์ด๋ก ๊ตฌํํ ๋ฆฌ์คํธ (0) | 2020.11.06 |
[์๋ฃ๊ตฌ์กฐ] counting sort ๊ณ์์ ๋ ฌ (0) | 2020.08.18 |
[์๋ฃ๊ตฌ์กฐ] ์ํฅ์ ํ์ ๋ ฌ heapsort (0) | 2020.08.13 |