This repository was archived by the owner on Jan 8, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLinkedList.h
More file actions
191 lines (191 loc) · 4.72 KB
/
LinkedList.h
File metadata and controls
191 lines (191 loc) · 4.72 KB
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
188
189
190
191
#pragma once
#include "BusInfo.cpp"
/// <summary>
/// Øàáëîí îäíîñâÿçíîãî ñïèñêà
/// </summary>
/// <typeparam name="T">Ëþáîé êëàññ</typeparam>
template<class T>
class LinkedList
{
private:
/// <summary>
/// Âíóòðåííèé êëàññ LinkedList, ñëóæèò îá¸ðòêîé íàä T äëÿ ñîäåðæàíèÿ id è ññûëêè íà ñëåäóþùèé ýëåìåíò
/// </summary>
class Node
{
public:
int id;
T* value;
Node* next;
/// <summary>
/// Êîíñòðóêòîð, ñîçäàþùèé îá¸ðòêó íàä Ò
/// </summary>
Node(int id, T* instance) {
this->id = id;
this->value = instance;
this->next = nullptr;
}
///Äåñòðóêòîð, êîòîðûé âûäà¸ò îøèáêó, åñëè ïðè óäàëåíèè íå îáíóëèòü ññûëêó íà ñëåäóþùèé ýëåìåíò
~Node() {
if (next != nullptr)
{
throw new std::exception("Óíè÷òîæåíèå âåòâè");
}
};
};
public:
LinkedList()
{
initialize();
}
/// <summary>
/// Äîáàâëÿåò íîâóþ íîäó, ñîäåðæàùóþ instance. Êàæäûé ðàç óâåëè÷èâàåò ñ÷¸ò÷èê, ÷òîáû id íå ïîâòîðÿëîñü
/// </summary>
/// <param name="instance">Ýêçåìïëÿð êëàññà Ò, êîòîðûé áóäåò äîáàâëåí â ñïèñîê</param>
/// <returns>Âîçâðàùàåò id íîâîé íîäû èëè -1 ïðè îøèáêå âñòàâêè</returns>
int add(T* instance)
{
if (insert(counter, instance))
{
return counter++;
}
else
{
return -1;
}
}
/// <summary>
/// Äîáàâëåíèå instance ïî óêàçàííîìó id
/// </summary>
/// <param name="id">èäåíòèôèêàòîð, ïî êîòîðîìó íóæíî äîáàâèòü íîäó</param>
/// <param name="instance">ýêçåìïëÿð êëàññà Ò, êîòîðûé áóäåò äîáàâëåí â ñïèñîê</param>
/// <returns>Âîçâðàùàåò true, åñëè ïîëó÷èëîñü âñòàâèòü è false, åñëè óæå ñóùåñòâóåò íîäà ñ òàêèì æå id</returns>
bool insert(int id, T* instance)
{
bool res = insert_node(new Node(id, instance));
return res;
}
/// <summary>
/// Âûïîëíÿåò ïîèñê íîäû, ñëåäóþùàÿ çà êîòîðîé èìååò èäåíòèôèêàòîð ðàâíûé âõîäíîìó ïàðàìåòðó id.
/// Ïðîèçâîäèò óäàëåíèå ñëåäóùåé çà íàéäåííîé íîäîé è ïðèñîåäèíåíèå ñìëåäóþùåé çà óäàë¸ííîé íîäû ê íàéäåííîé.
/// </summary>
/// <param name="id">èäåíòèôèêàòîð, ïî êîòîðîìó íóæíî óäàëèòü íîäó</param>
/// <returns>Âîçâðàùàåò true, åñëè ïîëó÷èëîñü óäàëèòü è false, åñëè íå ñóùåñòâóåò íîäà ñ òàêèì æå id</returns>
bool remove(int id)
{
Node* temp_node = start;
if (temp_node == nullptr)
{
return false;
}
if (temp_node->id == id)
{
start = temp_node->next;
temp_node->next = nullptr;
delete temp_node;
return true;
}
while (temp_node != nullptr &&
temp_node->next != nullptr &&
temp_node->next->id != id)
{
temp_node = temp_node->next;
}
if (temp_node == nullptr || temp_node->next == nullptr)
{
return false;
}
else
{
Node* temp_node_next = temp_node->next->next;
temp_node->next->next = nullptr;
delete temp_node->next;
temp_node->next = temp_node_next;
return true;
}
}
/// <summary>
/// Èùåò íîäó ñ óêàçàííûì id
/// </summary>
/// <param name="new_node">Âîçâðàùàåò íàéäåííóþ íîäó èëè nullptr, åñëè íàéòè íå óäàëîñü</param>
/// <returns></returns>
T* find(int id)
{
Node* temp_node = find_node(id);
return temp_node == nullptr ? nullptr : temp_node->value;
}
/// <summary>
/// Âîçâðàùàåò ñòàðòîâóþ íîäó, îíà ìîæåò áûòü nullptr
/// </summary>
T* find_first()
{
return start == nullptr ? nullptr : start->value;
}
/// <summary>
/// Èùåò íîäó ñ óêàçàííûì id. Âîçâðàùàåò ñëåäóþùó çà íåé íîäó, îíà ìîæåò áûòü nullptr
/// </summary>
T* find_next(int id)
{
Node* temp_node = find_node(id);
return (temp_node == nullptr || temp_node->next == nullptr) ? nullptr : temp_node->next->value;
}
private:
Node* start;
int counter;
/// <summary>
/// Ìåòîä, çàïóöñêàåìûé â êîíñòðóêòîðå
/// <para/>Óñòàíàâëèâàåò ñ÷¸ò÷èê â 0 è îáíóëÿåò óêàçàòåëü íà ñòàðòîâóþ íîäó
/// </summary>
void initialize()
{
this->counter = 0;
start = nullptr;
}
/// <summary>
/// Ïåðåáîð íîä, ïîêà íå ñîâïàä¸ò id
/// </summary>
/// <returns>Âîçâðàùàåò íîäó ñ íóæíûì id èëè nullptr</returns>
Node* find_node(int id)
{
Node* temp_node = start;
while (temp_node != nullptr && temp_node->id != id)
{
temp_node = temp_node->next;
}
return temp_node;
}
/// <summary>
/// Âñòàâêà íîâîé íîäû.
/// Çàíèìàåò ìåñòî ïî âîçðàñòàíèþ id (ñîðòèðîâêà ïðè âñòàâêå)
/// </summary>
/// <returns>Âîçâðàùàåò true, åñëè ïîëó÷èëîñü âñòàâèòü è false, åñëè óæå ñóùåñòâóåò íîäà ñ òàêèì æå id</returns>
bool insert_node(Node* new_node)
{
if (start == nullptr)
{
start = new_node;
return true;
}
Node* temp_node = start;
if (temp_node->id > new_node->id)
{
new_node->next = temp_node;
start = new_node;
return true;
}
while (temp_node->id < new_node->id && temp_node->next != nullptr)
{
temp_node = temp_node->next;
}
if (temp_node->id == new_node->id)
{
return false;
}
if (temp_node->next != nullptr)
{
new_node->next = temp_node->next;
}
temp_node->next = new_node;
return true;
}
};