728x90
์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ๋?
- ๋จ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์ ํ ๋
ธ๋๊ฐ ์ฐพ๊ธฐ ํ๋ค๋ค๋ ์ ์
๋ณด์ํ๋ฆฌ์คํธ - ๊ฐ ๋ ธ๋๊ฐ ์ ํ ๋ ธ๋์ ํ์ ๋ ธ๋์ ๋ํ ๋งํฌ๋ฅผ ๊ฐ์ง๋ ๋ฆฌ์คํธ
- ๋
ธ๋์
left link์right link๊ฐ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ๋งํฌ์ ์ผ์ชฝ ๋งํฌ๋ฅผ ์ฐ๊ฒฐ์ง๋๋ค. ํค๋๋ถ๋ถ๋๋ ธ๋๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.- ๋จ์ ์
๊ณต๊ฐ์ ๋ง์ด ์ฐจ์งํ๊ณ์ฝ๋๊ฐ ๋ณต์กํ๋ค.
โป ํค๋๋ ธ๋๋?
ํค๋๋ ธ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง์ง ์๊ณ ์ค๋ก์ง ์ฝ์ , ์ญ์ ์ฝ๋๋ฅผ ๊ฐ๋จํ๊ฒ ํ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ด์ง ๋ ธ๋์ด๋ค. ๋ฐ๋ผ์ ํค๋ ํฌ์ธํฐ์์ ๊ตฌ๋ณ์ด ํ์ํ๋ฉฐ ๋ฆฌ์คํธ๊ฐ ๊ณต๋ฐฑ์ํ๋ผ๋ฉด ํค๋ ๋ ธ๋๋ง ์กด์ฌํ๋ ์ํ์ด๋ค. ์ด๋ ํค๋๋ ธ๋์ left link๋ right link๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ right link๋ left link๋ฅผ ๊ฐ๋ฆฌํค๋ ์ํ์ด๋ค.
๋ ธ๋ ๊ตฌ์กฐ์ฒด
typedef int element;
// ์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋
ธ๋ ํ์
typedef struct DListNode {
element data;
struct DListNode* llink;
struct DListNode* rlink;
}DListNode;
// ์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ด๊ธฐํ
void init(DListNode* phead) {
phead->llink = phead;
phead->rlink = phead;
}
- data๋ ๊ธฐ์กด์ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๊ฐ์ง๋ง, link ๋์ ์ llink์ rlink 2๊ฐ๋ฅผ ๋ฉค๋ฒ๋ณ์๋ฅผ ๊ฐ์ง๋ค.
- llink์ค rlink๋ phead๋ก ์ด๊ธฐํ
์ฝ์ ์ฐ์ฐ
- new_node์ llink๊ฐ before๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- new_node์ rlink๊ฐ before์ rlink๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- before์ rlink์ llink๊ฐ new_node๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- before์ rlink๊ฐ new_node๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
// ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋
ธ๋ before์ ์ค๋ฅธ์ชฝ์ ์ฝ์
void dinsert(DListNode* before, element data) {
DListNode* newnode = (DListNode*)malloc(sizeof(DListNode));
newnode->data = data;
newnode->llink = before; // (1)
newnode->rlink = before->rlink; // (2)
before->rlink->llink = newnode; // (3)
before->rlink = newnode; // (4)
}
์ญ์ ์ฐ์ฐ
- removed์ llink์ rlink์ removed์ rlink์ ์ฐ๊ฒฐํ๋ค.
- removed์ rlink์ llink์ removed์ llink์ ์ฐ๊ฒฐํ๋ค.
// ๋
ธ๋ removed๋ฅผ ์ญ์
void ddelete(DListNode* head, DListNode* removed) {
if (removed == head) return;
head->rlink = removed->rlink;
removed->rlink->llink = removed->llink;
free(removed);
}
์ ์ฒด์ฝ๋
#include <stdio.h>
#include <stdlib.h>
typedef int element;
// ์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋
ธ๋ ํ์
typedef struct DListNode {
element data;
struct DListNode* llink;
struct DListNode* rlink;
}DListNode;
// ์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ด๊ธฐํ
void init(DListNode* phead) {
phead->llink = phead;
phead->rlink = phead;
}
// ์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ํ ์ถ๋ ฅ
void print_dlist(DListNode* phead) {
DListNode* p;
for (p = phead->rlink; p != phead; p = p->rlink) {
printf("<-| |%d| |-> ", p->data);
}
printf("\n");
}
// ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋
ธ๋ before์ ์ค๋ฅธ์ชฝ์ ์ฝ์
void dinsert(DListNode* before, element data) {
DListNode* newnode = (DListNode*)malloc(sizeof(DListNode));
newnode->data = data;
newnode->llink = before;
newnode->rlink = before->rlink;
before->rlink->llink = newnode;
before->rlink = newnode;
}
// ๋
ธ๋ removed๋ฅผ ์ญ์
void ddelete(DListNode* head, DListNode* removed) {
if (removed == head) return;
head->rlink = removed->rlink;
removed->rlink->llink = removed->llink;
free(removed);
}
// ๋ฉ์ธ
int main(void) {
DListNode* head = (DListNode*)malloc(sizeof(DListNode));
init(head);
printf("์ถ๊ฐ ๋จ๊ณ\n");
for (int i = 0; i < 5; i++) {
dinsert(head, i);
print_dlist(head);
}
printf("\n์ญ์ ๋จ๊ณ\n");
for (int i = 0; i < 5; i++) {
print_dlist(head);
ddelete(head, head->rlink);
}
free(head);
return 0;
}
728x90