Используя линейный односвязный список найти введённое с клавиатуры число, удалить число стоящий перед найденным за 1 позицию и вставить число, введённый с клавиатуры, перед найденным .pascal. через указатели {new(x); {выделение места в памяти для переменной типа spisok} x^.data : =3; { заполним поле data первого элемента} x^.next : =nil; {заполним поле next первого элемента: указатель в nil } head : =x; {установим указатель головы списка на первый элемент}}-пример

leafkKuro leafkKuro    1   10.08.2019 16:00    0

Ответы
професорАртём професорАртём  04.10.2020 09:37
// Использование указателей для создания односвязного списка
// Сделано на базе демонстрационного примера 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
ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика