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

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

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

[C์–ธ์–ด]์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๊ฑฐ๊พธ๋กœ ์ถœ๋ ฅํ•˜๊ธฐ (์—ญ์ˆœ์œผ๋กœ ๋งŒ๋“ค๊ธฐ)

mmin.h 2020. 11. 8. 17:53

์•ˆ๋…•ํ•˜์„ธ์š” ์ฃผ์ธ์žฅ H์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฑฐ๊พธ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(linked list๋ฅผ ์ž˜ ๋ชจ๋ฅด์‹ ๋‹ค๋ฉด) modernalchemist.tistory.com/39?category=921458

 

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

linked representation ๋™์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์žˆ๊ณ  ์‚ญ์ œ๋‚˜ ์‚ฝ์ž… ์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์—ฐ๊ฒฐ๋œ ํ‘œํ˜„ ์ด ์—ฐ๊ฒฐ๋œ ํ‘œํ˜„์€ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋“ค์„ ์—ฐ๊ฒฐ. ์ด๋Š” ํŠธ๋ฆฌ ๊ทธ๋ž˜ํ”„ ์Šคํƒ ํ ๋“ฑ

modernalchemist.tistory.com

์œ„์˜ ๊ธ€์„ ์ฝ๊ณ  ์˜ค์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ผ๋‹จ ์ฝ”๋“œ ๋จผ์ € ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

ListNode* reverse(ListNode* head)
{
	// ์ˆœํšŒ ํฌ์ธํ„ฐ๋กœ p, q, r์„ ์‚ฌ์šฉ
	ListNode* p, * q, * r;

	p = head;         		// p๋Š” ์—ญ์ˆœ์œผ๋กœ ๋งŒ๋“ค ๋ฆฌ์ŠคํŠธ
	q = NULL;         		// q๋Š” ์—ญ์ˆœ์œผ๋กœ ๋งŒ๋“ค ๋…ธ๋“œ
	while (p != NULL) {
		r = q;          	// r์€ ์—ญ์ˆœ์œผ๋กœ ๋œ ๋ฆฌ์ŠคํŠธ.    
					// r์€ q, q๋Š” p๋ฅผ ์ฐจ๋ก€๋กœ ๋”ฐ๋ผ๊ฐ„๋‹ค.
		q = p;
		p = p->link;
		q->link = r;      	// q์˜ ๋งํฌ ๋ฐฉํ–ฅ์„ ๋ฐ”๊พผ๋‹ค.
	}
	return q;
}

 

์ด ์ฝ”๋“œ๋งŒ ๋ณด์‹ ๋‹ค๋ฉด ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ€์‹คํ…๋ฐ์š” ๊ทธ๋ฆผ์„ ์ถ”๊ฐ€ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด์— ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋˜ ํฌ์ธํ„ฐ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ๋ชฐ์•„๋„ฃ์–ด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ๋…ธ๋“œ์”ฉ ์‰ฌํ”„ํŠธ ์‹œํ‚ค๋ฉด์„œ ์ƒˆ๋กญ๊ฒŒ link๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ž‘์—…์„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.  ์ด๋ฅผ ์ ์šฉํ•œ ์ „์ฒด ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//
typedef int element;

//
typedef struct ListNode { 	// ๋…ธ๋“œ ํƒ€์ž…์„ ๊ตฌ์กฐ์ฒด๋กœ ์ •์˜ํ•œ๋‹ค.
	element data;
	struct ListNode* link;
} ListNode;

// ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
void error(char* message)
{
	fprintf(stderr, "%s\n", message);
	exit(1);
}

//
ListNode* insert_first(ListNode* head, element value)
{
	ListNode* p = (ListNode*)malloc(sizeof(ListNode));//(1)
	p->data = value;//(2)
	p->link = head;	// ํ—ค๋“œ ํฌ์ธํ„ฐ์˜ ๊ฐ’์„ ๋ณต์‚ฌ//(3)
	head = p;		// ํ—ค๋“œ ํฌ์ธํ„ฐ ๋ณ€๊ฒฝ//(4)
	return head;
}

//
void print_list(ListNode* head)
{
	for (ListNode* p = head; p != NULL; p = p->link)
		printf("%d->", p->data);
	printf("NULL \n");
}

//
ListNode* reverse(ListNode* head)
{
	// ์ˆœํšŒ ํฌ์ธํ„ฐ๋กœ p, q, r์„ ์‚ฌ์šฉ
	ListNode* p, * q, * r;

	p = head;         		// p๋Š” ์—ญ์ˆœ์œผ๋กœ ๋งŒ๋“ค ๋ฆฌ์ŠคํŠธ
	q = NULL;         		// q๋Š” ์—ญ์ˆœ์œผ๋กœ ๋งŒ๋“ค ๋…ธ๋“œ
	while (p != NULL) {
		r = q;        // r์€ ์—ญ์ˆœ์œผ๋กœ ๋œ ๋ฆฌ์ŠคํŠธ.    
			// r์€ q, q๋Š” p๋ฅผ ์ฐจ๋ก€๋กœ ๋”ฐ๋ผ๊ฐ„๋‹ค.
		q = p;
		p = p->link;
		q->link = r;      	// q์˜ ๋งํฌ ๋ฐฉํ–ฅ์„ ๋ฐ”๊พผ๋‹ค.
	}
	return q;
}

// ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ
int main(void)
{
	ListNode* head = NULL;

	printf("> head list ์ƒ์„ฑ.\n");
	head = insert_first(head, 10);
	print_list(head);
	head = insert_first(head, 20);
	print_list(head);
	head = insert_first(head, 30);
	print_list(head);

	printf("> After concat.\n");
	head = reverse(head);
	print_list(head);

	return 0;
}