-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDoublyLinkedList5.cpp
More file actions
132 lines (109 loc) · 4.92 KB
/
DoublyLinkedList5.cpp
File metadata and controls
132 lines (109 loc) · 4.92 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
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
struct list { // Ñòðóêòóðà äâóõñâÿíîãî ñïèñêà
int inf; // Èíôîðìàöèîííîå ïîëå
list *prev; // Ïîëå ñ ññûëêîé íà ïðåäûäóùèé ýëåìåíò
list *next; // Ïîëå ñ ññûëêîé íà ñëåäóþùèé ýëåìåíò
};
void push(list *&h, list *&t, int x) { //âñòàâêà ýëåìåíòà â êîíåö ñïèñêà
list *r = new list; //ñîçäàåì íîâûé ýëåìåíò
r->inf = x;
r->next = NULL; //âñåãäà ïîñëåäíèé
if (!h && !t) { //åñëè ñïèñîê ïóñò
r->prev = NULL; //ïåðâûé ýëåìåíò
h = r; //ýòî ãîëîâà
}
else {
t->next = r; //r - ñëåäóþùèé äëÿ õâîñòà
t->prev = t; //õâîñò - ïðåäûäóùèé äëÿ r
}
t = r; //r òåïåðü õâîñò
}
void print(list *h, list *t) { //ïå÷àòü ýëåìåíòîâ ñïèñêà
list *p = h; //óêçàòåëü íà ãîëîâó
while (p) { //ïîêà íå äîøëè äî êîíöà ñïèñêà
cout << p->inf << ' ';
p = p->next; //ïåðåõîä ê ñëåäóþùåìó ýëåìåíòó
}
}
list *find(list *h, list *t, int x) { //ïîèñê ýëåìåíòà ñïèñêà
list *p = h; //óêçàòåëü íà ãîëîâó
while (p) { //ïîêà íå äîøëè äî êîíöà ñïèñêà
if (p->inf == x) // åñëè íàøëè, ïðåêðàùàåì öèêë
break;
p = p->next; //ïåðåõîä ê ñëåäóþùåìó ýëåìåíòó
}
return p; //âîçâðàùàåì óêàçàòåëü
}
void insert_after(list *&h, list *&t, list *r, int x) { //âñòàâêà ïîñëå r
list *p = new list; //ñîçäàåì íîâûé ýëåìåíò
p->inf = x;
if (r == t) { //åñëè âñòàâëÿåì ïîñëå õâîñòà
p->next = NULL; //âñòàâëÿåìûé ýë-ò - ïîñëåäíèé
p->prev = r; //âñòàâëÿåì ïîñëå r
r->next = p;
t = p; //òåïåðü õâîñò - p
}
else { //âñòàâëÿåì â ñåðåäèíó ñïèñêà
r->next->prev = p; //äëÿ ñëåäóþùåãî çà r ýë-òà ïðåäûäóùèé - p
p->next = r->next; //ñëåäóþùèé çà p - ñëåäóþùèé çà r
p->prev = r; //p âñòàâëÿåì ïîñëå r
r->next = p;
}
}
void del_node(list *&h, list *&t, list *r) { //óäàëÿåì ïîñëå r
if (r == h && t == r) //åäèíñòâåííûé ýëåìåíò ñïèñêà
h = t = NULL;
else if (r == h) { //óäàëÿåì ãîëîâó ñïèñêà
h = h->next; //ñäâèãàåì ãîëîâó
h->prev = NULL;
}
else if (r == t) { //óäàëÿåì õâîñò ñïèñêà
t = t->prev; //ñäâèãàåì õâîñò
t->next = NULL;
}
else {
r->next->prev = r->prev; //äëÿ ñëåäóþùåãî îò r ïðåäûäóùèì
r->prev->next = r->next; //äëÿ ïðåäûäóùåãî îò r ñëåäóþùèì
}
delete r; //óäàëÿåì r
}
void del_list(list *&h, list *&t) { //óäàëÿåì ñïèñîê
while (h) { //ïîêà ñïèñîê íå ïóñò
list *p = h; //óêàçàòåëü íà ãîëîâó
h = h->next; //ïåðåíîñèì ãîëîâó
h->prev = NULL; //îáíóëÿåì
delete p; //óäàëÿåì p
}
}
void handler(list *&h, list *&t, int x) { //ôóíêöèÿ-îáðàáîò÷èê
list *p = h; //óêçàòåëü íà ãîëîâó
while (p) { //ïîêà íå äîøëè äî êîíöà ñïèñêà
if (p->inf / 1000 == 0 && p->inf / 100 > 0) { //åñëè ÷èñëî òðåõçíà÷íîå, òî âñòàâëÿåì íîâûé ýëåìåíò
insert_after(h, t, p, x);
}
p = p->next; //ïåðåõîä ê ñëåäóþùåìó ýëåìåíòó
}
}
int main() {
cout << "Enter your numbers: ";
string input; getline(cin, input); //ñ÷èòûâàåì ÷èñëà
stringstream str(input);
list *head = NULL; //îáúÿâëÿåì ñïèñîê
list *tail = NULL;
string snumber; //äîáàâëÿåì ÷èñëà â ñïèñîê
while (str >> snumber) {
int number = stoi(snumber);
push(head, tail, number);
}
cout << "Enter your number to insert: "; //ââîäèì ÷èñëî äëÿ âñòàâêè
int x; cin >> x;
//print(head, tail); //âûâîäèì ñïèñîê
handler(head, tail, x); //îáðàáîòêà ñïèñêà
print(head, tail); //âûâîäèì èçìåíåííûé ñïèñîê
cout << "\nSuccess!\n";
system("pause");
return 0;
}