Используя линейный односвязный список найти введённое с клавиатуры число, удалить число стоящий перед найденным за 1 позицию и вставить число, введённый с клавиатуры, перед найденным .pascal. через указатели {new(x); {выделение места в памяти для переменной типа spisok} x^.data : =3; { заполним поле data первого элемента} x^.next : =nil; {заполним поле next первого элемента: указатель в nil } head : =x; {установим указатель головы списка на первый элемент}}-пример
// Сделано на базе демонстрационного примера PascalABC.Net
//
// PascalABC.NET 3.2, сборка 1325 от 19.10.2016
type
PNode=^TNode;
TNode=record
data:integer;
next:PNode;
end;
function NewNode(d:integer;n:PNode):PNode;
begin
New(Result);
Result^.data:=d;
Result^.next:=n;
end;
procedure WriteNode(a:PNode);
// Вывод односвязного списка
begin
Writeln('Содержимое односвязного списка: ');
var p:=a;
while p<>nil do begin
Write(p^.data,' ');
p:=p^.next;
end;
Writeln
end;
function SeekNode(k:integer;a:PNode):PNode;
// Поиск элемента со значением k в списке
begin
var p:=a;
Result:=Nil;
while p<>nil do begin
if p^.data=k then begin Result:=p; break end;
p:=p^.next
end
end;
function PredNode(a,f:PNode):PNode;
// Поиск предшественника f среди a
begin
var p:=a;
while p^.next<>f do p:=p^.next;
Result:=p
end;
procedure Clear(a:pNode);
// Разрушение односвязного списка
begin
var p:=a;
while p<>nil do begin
var p1:=p;
p:=p^.next;
Dispose(p1); // Память обязательно возвращать
end
end;
var
first,found,father,grandfather,greatgrandfather:PNode;
begin
Randomize;
first:=nil;
for var i:=1 to 10 do
first:=NewNode(Random(100),first);
WriteNode(first); // первоначальное состояние списка
var k:=ReadInteger('Введите число для поиска в списке');
found:=SeekNode(k,first);
if found<>nil then begin
father:=PredNode(first,found); // отец
grandfather:=PredNode(first,father); // дед
greatgrandfather:=PredNode(first,grandfather); // прадед
greatgrandfather^.next:=father;
Writeln('Элемент ',grandfather^.data, ' удален');
Dispose(grandfather);
WriteNode(first);
k:=ReadInteger('Введите число для вставки');
father^.next:=NewNode(k,found);
WriteNode(first);
end
else Writeln('Такого числа в списке нет');
Clear(first)
end.
Пример
Содержимое односвязного списка:
11 75 44 86 88 83 92 18 4 23
Введите число для поиска в списке 88
Элемент 44 удален
Содержимое односвязного списка:
11 75 86 88 83 92 18 4 23
Введите число для вставки 40
Содержимое односвязного списка:
11 75 86 40 88 83 92 18 4 23