-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcycled_linked_list.cpp
More file actions
133 lines (107 loc) · 2.89 KB
/
cycled_linked_list.cpp
File metadata and controls
133 lines (107 loc) · 2.89 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
#include <iostream>
using namespace std;
struct cycled_linked_list {
// тип даних, що зберігаються
typedef int value_type;
struct node {
value_type value;
node *next, *prev;
node(value_type value) {
this->value = value;
next = nullptr;
prev = nullptr;
}
// видалити поточний елемент із збереженням порядку
// не забудьте змінити розмір, якщо він потрібен
void pull_out() {
if (prev != nullptr) {
prev->next = next;
}
if (next != nullptr) {
next->prev = prev;
}
delete this;
}
};
// якщо потрібно підтримувати розмір, розкоментуйте всі його згадування
// size_t size;
node *entry;
// entry завжди вказує на останній доданий елемент
cycled_linked_list() {
// size = 0;
entry = nullptr;
}
void push_back(value_type value) {
node *new_node = new node(value);
if (!empty()) {
new_node->next = entry->next;
new_node->prev = entry;
entry->next->prev = new_node;
entry->next = new_node;
} else {
new_node->next = new_node;
new_node->prev = new_node;
}
entry = new_node;
// size++;
}
value_type pop_back() {
if (empty()) {
throw "Can't pop";
}
value_type value = entry->value;
node *old_entry = entry;
if (entry->prev == entry) {
entry = nullptr;
} else {
entry = entry->prev;
entry->next = old_entry->next;
old_entry->next->prev = entry;
}
delete old_entry;
// size--;
return value;
}
bool empty() {
return entry == nullptr;
}
~cycled_linked_list() {
if (empty()) {
return;
}
node *i = entry;
do {
node *s = i;
i = i->next;
delete s;
} while (i != entry);
}
};
int main() {
cycled_linked_list cll;
size_t n;
cin >> n;
for (size_t i = 0; i < n; i++) {
int r;
cin >> r;
cll.push_back(r);
}
// обхід
if (!cll.empty()) {
auto i = cll.entry;
do {
i = i->next;
cout << i->value << ' ';
} while (i != cll.entry);
}
cout << endl;
// видалити 2 елемент
cll.entry->next->next->pull_out();
//cll.size--;
// дістаємо всі елементи
while (!cll.empty()) {
cout << cll.pop_back() << ' ';
}
cout << endl;
return 0;
}