본문 바로가기
Computer Science

쿠리 / 더블 링크드 리스트

by OKOK 2018. 12. 6.

더블 링크드 리스트

배열을 사용해서 링크드 리스트

배열의 크기를 어떻게 설정해야 하는가

구조체를 만들어서 노드를 만들어도 될 것 같음

그리고 삽입, 삭제 그리고 탐색이 가능함

포인터가 가르키는 것을 반복함 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
18.12.06
더블 링크드 리스트
노드1을 추가시에 피리스트가 가르키는 것을 노드1의 프리브를 가르킴
노드 2가 추가 되는 경우 동일하게 반복함
추가되는 노드는 항상 싱글 링크드 리스트에서 뒤쪽으로 추가됨
노드 내의 프리브라고 이름 지어진 이유이기도 함
싱글 링크드 리스트를 바탕으로 더블 링크드 리스트 설명
추가되는 노드1의 프리브, 넥스틑 먼저 지정해야 함
검색할 때 헤드에서 테일까지 혹은 테이엘서 헤드까지 검색할 수 있음
헤드에서 테일로 검색하는 경우
삭제
노드2가 가진 연결은 안지워도 됨
싱글 링크드 리스트도 피리스트 대신 더미 노드인 태일 노드를 미리 만들어 두고 사용하면 삭제시 좀 더 쉬움
해쉬와 싱글 링크드 리스트를 같이 사용하면 페이지 단어 검색에 대한 해결도 될 수 있음
*/
 
#include <iostream>
 
using namespace std;
 
int arr_idx = 0;
 
struct NODE {
    int v;
    NODE * prev;  //for single linked list
    NODE * next;  //for double linked list
} a[20000];
 
 
NODE *myalloc(void)
{
    return &a[arr_idx++];
}
 
NODE * pTail;  //더블 링크드 리스트의 끝. (싱글 링크드 리스트의 pList의 역활)
NODE * pHead;  //더블 링크드 리스트의 시작.
 
void print_node(void);
 
int main(void)
{
    arr_idx = 0;  //사용할 배열 초기화
 
    pHead = myalloc();  //Head 노드를 미리 만들어둠.
    pTail = myalloc();  //Tail 노드를 미리 만들어둠.
 
    pTail->prev = pHead;  //pHead <-> pTail 을 연결
    pHead->next = pTail;
 
 
    NODE *p;
 
    // 노드 추가..
    for (int i = 1; i < 10; i++)
    {
        p = myalloc();
        p->= i;
        p->prev = pTail->prev;  //기존 싱글 리스트 연결 방식과 동일(저장 위치만 pTail->prev 로 바뀜)
        pTail->prev = p;
 
        //next 연결. 
        p->next = p->prev->next;  //이전노드가 가르키던걸 내가 가르키고.
        p->prev->next = p;        //이전 노드는 나를 가르키게 만듬.
    }
 
    print_node();
 
 
 
    //HEAD 부터 검색해서 노드(5) 삭제
    for (NODE * iter = pHead->next; iter != pTail; iter = iter->next)  //HEAD 에서 모든 노드를 따라가면서..
    {
        if (iter->== 5)  //노드(5)를 찾으면
        {
            iter->prev->next = iter->next;  //이전 노드의 다음(next)은 내가 가르키던 다음(next)을
            iter->next->prev = iter->prev;  //다음 노드의 이전(next)은 내가 가르키던 이전(prev)을
 
            cout << "Delete 5 node ... " << endl << endl;
        }
    }
 
    print_node();
 
 
    //TAIL 부터 검색해서 노드(3) 삭제
    for (NODE * iter = pTail->prev; iter != pHead; iter = iter->prev)  //TAIL 에서 모든 노드를 따라가면서..
    {
        if (iter->== 3)  //노드(3)를 찾으면
        {
            iter->prev->next = iter->next;  //이전 노드의 다음(next)은 내가 가르키던 다음(next)을
            iter->next->prev = iter->prev;  //다음 노드의 이전(next)은 내가 가르키던 이전(prev)을
 
            cout << "Delete 3 node ... " << endl << endl;
        }
    }
 
    print_node();
 
 
    //TAIL 부터 검색해서 모든노드 삭제
    for (NODE * iter = pTail->prev; iter != pHead; iter = iter->prev)  //TAIL 에서 모든 노드를 따라가면서..
    {
        iter->prev->next = iter->next;  //이전 노드의 다음(next)은 내가 가르키던 다음(next)을
        iter->next->prev = iter->prev;  //다음 노드의 이전(next)은 내가 가르키던 이전(prev)을
 
        cout << "Delete node ... " << iter-><< endl << endl;
    }
 
    print_node();
 
 
    //다시 노드 추가..
    for (int i = 1; i < 10; i++)
    {
        p = myalloc();
        p->= i;
        p->prev = pTail->prev;  //기존 싱글 리스트 연결 방식과 동일(저장 위치만 pTail->prev 로 바뀜)
        pTail->prev = p;
 
        //next 연결. 
        p->next = p->prev->next;  //이전노드가 가르키던걸 내가 가르키고.
        p->prev->next = p;        //이전 노드는 나를 가르키게 만듬.
    }
 
    print_node();
}
 
 
 
void print_node(void)
{
    cout << "From head ~~ " << endl;
    for (NODE * iter = pHead->next; iter != pTail; iter = iter->next)
        cout << iter-><< " ";
    cout << endl;
 
    cout << "From tail ~~ " << endl;
    for (NODE * iter = pTail->prev; iter != pHead; iter = iter->prev)
        cout << iter-><< " ";
    cout << endl << endl;
}
 
cs


'Computer Science' 카테고리의 다른 글

공통 조상 찾기 트리  (0) 2018.12.07
expert / 블록 부품  (0) 2018.12.06
쿠리 프로 시험 유용 그래프 사용법  (0) 2018.12.06
박트리 - Pro 공부법  (0) 2018.12.04
박트리2 / 홍준 / 스타트링크  (0) 2018.12.04

댓글