๋ฐ˜๊ฐ€์›Œ์š”! ํ—ˆ๋ธŒ์ž…๋‹ˆ๋‹ค!

์ €๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ํ˜„๋Œ€ ์—ฐ๊ธˆ์ˆ ์‚ฌ๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋Š๋‚€ ์ ๋“ค๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ

[C์–ธ์–ด] ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ (linked list)

mmin.h 2020. 11. 6. 11:16

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์ด๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋์— ๋„๋‹ฌํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐ˜๋ณต์„ ์ค‘๋‹จ.