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
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
| uses
crt;
const
n = 4;
type
data = integer;// тип данных
spisok = ^spisoktype;// указатель
spisoktype = record // элемент
number: data; //данные
next: spisok; // указатель на следующий элемент
end;
var
tek, tek1: spisok; // текущие указатели
first, last: spisok; // указатели на первый и последний элементы списка
answer: integer;
i, c: word;
{вставка элемента в конец}
procedure addlast(var tek, last: spisok; j: word);
var
point: spisok; {указатель на создаваемый элемент}
t: spisok;{указатель для просмотра списка}
begin
New(Point);{создание элемента}
writeln('Введите элемент: ');
readln(point^.number);{заполнение данных}
writeln;
point^.next := nil;
if tek = nil then begin{если список был пуст}
tek := point;
first := tek;
end
else begin{если список не пуст}
t := tek;
while (t^.next <> nil) do
t := t^.next;
t^.next := point;
last := point;
end;
writeln('Элемент успешно добавлен!');
writeln;
end;
{вывод всех элементов}
procedure print(var tek: spisok; const first: spisok);
var
d: word;
begin
d := 0;
tek := first;
Writeln('Содержимое списка:');
if tek = nil then
writeln('Список пуст. ')
else
while tek <> nil do
begin
inc(d);
writeln(d, ' элемент списка: ', tek^.number);
tek := tek^.next;
end;
end;
{Удаление последнего элемента}
procedure dellast(var tek: spisok; var first, last: spisok);
begin
tek := first;
{задача указателя - достичь предпоследнего элемента списка, то есть
встать перед удаляемым элементом}
if (tek^.next = nil) then {если в списке остался только один элемент}
first := nil else
while (tek^.next^.next <> nil) do
{переход на следующий элемент}
tek := tek^.next;
{Удаляем последний элемент из списка и освобождаем занимаемую им память}
dispose(tek^.next);
{и чтобы список остался в согласованном состоянии, надо, чтобы последний
элемент (до удаления он являлся предпоследним) ссылался в NIL}
tek^.next := nil;
writeln('Элемент успешно удален!');
writeln;
end;
{удаление n-го элемента списка}
procedure deln(var tek, first, last: spisok);
var
key: word; prev, del: spisok;
begin
prev := nil;
tek := first;
writeln('Введите значение удаляемого элемента: ');
readln(key); // ключ для поиска элемента
writeln;
while tek <> nil do
if tek^.number = key then begin{Если обнаружен элемент, который требуется удалить}
if tek = first then {Если удаляемый элемент является первым элементом списка, то первым элементом списка назначаем следующий элемент}
first := tek^.next
{Если удаляемый элемент не является первым элементом списка, то поле
Next предыдущего элемента теперь должно указывать на элемент, который
является следующим относительно tek}
else
prev^.next := tek^.next;
{Если удаляемый элемент является последним элементом списка, то последним
элементом списка назначаем предыдущий элемент}
if tek = last then
last := prev; {Указатель на удаляемый элемент}
del := tek;{Указатель на следующий элемент}
Dispose(Del); {Освобождение памяти, занятой под элемент}
end
else {Переход к следующему элементу списка.}
begin
prev := tek;
tek := tek^.next;
end;
writeln('Элемент успешно удален!');
writeln;
end;
{сцепление двух списков}
procedure interflow(var tek, tek1, first: spisok);
var
pred1, first1: spisok;
f, o, n, g: word;
begin
writeln;
writeln('Чтобы выполнить сцепление сначала заполните второй список!');
writeln;
writeln('Сколько элементов вставляем? ');
readln(f);
writeln;
new(tek1); // заполнение второго списка
writeln;
writeln('Введите элемент: ');
writeln;
readln(tek1^.number);
tek1^.next := nil;
first1 := tek1;
pred1 := tek1;
for o := 2 to f do
begin
new(tek1);
writeln('Введите элемент: ');
writeln;
pred1^.next := tek1;
readln(tek1^.number);
tek1^.next := nil;
pred1 := tek1;
end;
writeln;
writeln('Первый список: ');
writeln;
print(tek, first);
writeln;
writeln('Второй список: ');
writeln;
n := 0; // вывод второго списка на экран
tek1 := first1;
if tek1 = nil then
writeln('Список пуст. ')
else
while tek1 <> nil do
begin
inc(n);
writeln(n, ' элемент списка: ', tek1^.number);
tek1 := tek1^.next;
end;
// сцепление первого и второго списков
tek := first;
while (tek^.next <> nil) do tek := tek^.next;
tek^.next := first1; {последний элемента первого списка указывает на начало второго}
tek1 := nil; {анулирование второго списка}
// вывод сцепленного списка
writeln;
writeln('Сцепление: ');
writeln;
g := 0;
tek := first;
Writeln('Содержимое списка:');
if tek = nil then
writeln('Список пуст. ')
else
while tek <> nil do
begin
inc(g);
writeln(g, ' элемент списка: ', tek^.number);
tek := tek^.next;
end;
end;
{Освобождение всех элементов списка}
procedure releaseall(var tek, first: spisok);
var
temp: spisok;
begin
tek := first; {указатель на первый элемент}
while (tek <> nil) do {начинаем просмотр списка от начала до конца}
begin
temp := tek^.next; {запоминаем следующий элемент}
dispose(tek); {освобождаем память текущего}
tek := temp; {делаем следующий элемент первым(текущим)}
end;
first := nil;
writeln;
writeln('Все элементы списка успешно освобождены!');
writeln;
end;
{инвертирование списка}
procedure invert(var tek, first, last: spisok);
var
p, t: spisok;
begin
p := nil;
last := first;
while first <> nil do
begin
t := first^.next;
first^.next := p;
p := first;
first := t;
end;
first := p;
writeln;
writeln('Список успешно инвертирован!');
writeln;
end;
begin
repeat
writeln;
writeln('Выберете пункт меню:');
writeln;
writeln('1: Вставка элемента в конец списка');
writeln('2: Вывод всех элементов на экран');
writeln('3: Удаление последнего элемента из списка');
writeln('4: Удаление n-го элемента из списка');
writeln('5: Сцепление двух списков');
writeln('6: Освобождение всех элементов списка');
writeln('7: Инвентировать список');
writeln('0: Выход');
writeln;
readln(answer);
writeln;
case answer of
1:
begin
writeln('Сколько элементов вставляем? ');
readln(c);
writeln;
for i := 1 to c do
addlast(tek, last, i);
end;
2: print(tek, first);
3: dellast(tek, first, last);
4: deln(tek, first, last);
5:
begin// проверка на заполненость первого списка
if first = nil then begin
writeln;
writeln('Ошибка, сначала заполните первый список!');
end else interflow(tek, tek1, first); end;
6: releaseall(tek, first);
7:
begin// проверка на заполненость списка
if (first = nil) or (first^.next = nil) then begin
writeln;
writeln('Ошибка, список пуст или имеет один элемент!');
end else invert(tek, first, last); end;
end;
until (answer = 0);
end. |