🤔원형 연결 리스트(Circular Linked List)

🔑원형 연결 리스트 구현

원형 연결 리스트는 마지막 노드를 처음 노드에 연결 시켰다는 점에서 단일 연결 리스트와 차이가 있습니다.

전에 구현했던 단일 연결 리스트를 조금 바꿔 원형 연결 리스트를 구현해보겠습니다.

원형 연결 리스트의 노드 생성은 단일 연결 리스트처럼 맨 뒤에 추가하는 방식으로만 구현했습니다. 하지만 노드 삽입은 단일 리스트의 삽입과 달리 아래 그림처럼 추가될 노드가 처음 노드를 가리키도록 한 다음 pHead가 추가될 노드를 가리키도록 하였습니다.

CircularQueue
https://www.geeksforgeeks.org/circular-linked-list/

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
Node* CreateNode(CircularList& list, const char* name, const int num)
{
    Node* element = new Node();
 
    strcpy_s(element->name, 15, name);
    element->number = num;
    element->pNext = nullptr;
 
    if (list.pHead == nullptr)
    {
        // pHead가 추가될 노드를 가리키고
        // 첫 노드는 자기 자신을 가리킴
        list.pHead = element;
        element->pNext = list.pHead;
    }
    else
    {
        // 추가될 노드가 추가했던 전 노드를 가리키고
        // 추가했던 전 노드가 추가될 노드를 가리킴
        // 마지막으로 pHead가 추가시킬 노드를 가리킴
        element->pNext = list.pHead->pNext;
        list.pHead->pNext = element;
        list.pHead = element;
    }
 
    return element;
}



🔑전체 소스 코드

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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <iostream>
#include <string.h>
 
struct Node
{
    char name[15];
    int number;
 
    Node* pNext;
};
 
struct CircularList
{
    Node* pHead{ nullptr };
};
 
Node* CreateNode(CircularList& list, const char* name, const int num);
int GetCountList(CircularList& list);
void PrintList(CircularList& list);
Node* FindNode(CircularList& list, const char* name);
void DeleteList(CircularList& list);
bool DeleteNode(CircularList& list, const char* name);
 
int main()
{
    CircularList myList;
 
    CreateNode(myList, "A", 1);
    CreateNode(myList, "B", 2);
    CreateNode(myList, "C", 3);
    CreateNode(myList, "D", 4);
 
    std::cout << GetCountList(myList) << std::endl;
 
    PrintList(myList);
    std::cout << std::endl;
 
    std::cout << FindNode(myList, "B")->number << std::endl;
    std::cout << std::endl;
 
    DeleteNode(myList, "A");
    DeleteNode(myList, "D");
    
    PrintList(myList);
 
    DeleteList(myList);
}
 
Node* CreateNode(CircularList& list, const char* name, const int num)
{
    Node* element = new Node();
 
    strcpy_s(element->name, 15, name);
    element->number = num;
    element->pNext = nullptr;
 
    if (list.pHead == nullptr)
    {
        list.pHead = element;
        element->pNext = list.pHead;
    }
    else
    {
        element->pNext = list.pHead->pNext;
        list.pHead->pNext = element;
        list.pHead = element;
    }
 
    return element;
}
 
int GetCountList(CircularList& list)
{
    Node* element = list.pHead->pNext;
 
    int count{};
 
    while (element != list.pHead)
    {
        if (list.pHead == nullptr)
        {
            return false;
        }
 
        ++count;
        element = element->pNext;
    }
 
    return ++count;
}
 
void PrintList(CircularList& list)
{
    Node* element = list.pHead;
 
    if (list.pHead == nullptr)
    {
        return;
    }
    
    do
	{
        element = element->pNext;
        std::cout << element->name << " " << element->number << std::endl;
	}
    while (element != list.pHead);
}
 
Node* FindNode(CircularList& list, const char* name)
{
    Node* element = list.pHead;
 
    while (element != nullptr)
    {
        if (strcmp(element->name, name) == 0)
        {
            return element;
        }
 
        element = element->pNext;
    }
 
    return element;
}
 
void DeleteList(CircularList& list)
{
    Node* element = list.pHead;
    Node* next;
 
    while (element != list.pHead)
    {
        next = element->pNext;
        delete element;
 
        element = next;
    }
 
    list.pHead = nullptr;
}
 
bool DeleteNode(CircularList& list, const char* name)
{
    Node* element = list.pHead->pNext;
    Node* previous = list.pHead;
 
    while (element != list.pHead)
    {
        if (strcmp(element->name, name) == 0)
        {
            break;
        }
 
        previous = element;
        element = element->pNext;
    }
 
    if (element == nullptr)
    {
        return false;
    }
 
    if (list.pHead == nullptr)
    {
        list.pHead = nullptr;
    }
    else if (element == list.pHead)
    {
        if (list.pHead == list.pHead->pNext)
        {
            list.pHead = nullptr;
        }
        else
        {
            list.pHead = previous;
            previous->pNext = element->pNext;
        }
    }
    else
    {
        previous->pNext = element->pNext;
    }
 
    delete element;
 
    return true;
}



Leave a comment