Исключение указанного и следующего за ним элементов в списке - Pascal

Узнай цену своей работы

Формулировка задачи:

Не получается дописать две процедуры, одна удаляет указанный элемент, а другая удаляет элемент, следующий за ним Вот собственно сами процедуры, а файл с кодом полной программы будет ниже

Решение задачи: «Исключение указанного и следующего за ним элементов в списке»

textual
Листинг программы
type
   tData = integer;
   
   tPtr = ^tNode;
   tNode = record
      data: tData;
      next: tPtr;
      prev: tPtr;
   end;
   
   tList = tPtr;
 
procedure WhiteEnter;
begin 
  Write('Нажмите Enter для возврата в основное меню...'); ReadLn;
end;
 
procedure Error(message: string);//выдача сообщения об ошибке
begin
   writeln('*** Ошибка: ' + message );
   writeln;
end;
 
procedure Init(var l: tList);//инициализация  списка
begin
   l := nil;
end;
 
function NotEmpty(l: tList): Boolean;//список не пуст
begin
   NotEmpty := l <> nil;
end;
 
function GetTail(l : tList) : tList; // Получить хвост списка
begin
  if l <> nil then
    while l^.next <> nil do
      l := l^.next;
  GetTail := l;
end;
 
function NewElem(D : tData; prev, next : tList) : tList; // Вставить новый элемент
var
  p : tList;
begin
  New(p);
  p^.data := D;
  p^.prev := prev;
  p^.next := next;
  NewElem := p;
end;
 
procedure Put(var l: tList; D: tData);
var
  p: tPtr;
begin
  p := GetTail(l); // Получить хвост
  if p = nil then
    l := NewElem(D, nil, nil) // Это начало
  else
    p^.next := NewElem(D, p, nil); // Это новый хвост
end;
 
procedure ClearAll(var l: tList);
var
  p : tList;
begin
  while l <> nil do
    begin
      p := l;
      l := l^.next;
      Dispose(p);
    end;
end;
 
procedure Clear(var l: tList);//очистка
begin
  ClearAll(l);
  WriteLn('Список очищен.');
  WhiteEnter;
end;
 
procedure WriteList(l: tList);
var n : Integer;
begin
  n := 0;
  Write('Список:');
  if l = nil then
    Write(' пусто')
  else
    while l <> nil do 
      begin
        inc(n);
        write(' (', n, ') ', l^.data);
        l := l^.next;
      end;
  WriteLn('.');
  WhiteEnter;
end;
 
procedure Fill(var l: tList);//заполнить список
var
   x: tData;
begin
  ClearAll(l);
  writeln( 'Вводите элементы(целые числа) по одному' );
  writeln( 'Конец ввода - 0' );
  repeat
     write( '? ' ); readln(x);
     if x <> 0 then
       Put(l, x);
  until x = 0;
  WriteLn('Ввод элементов завершен.'); WhiteEnter;
end;
 
function Counter(l: tList): integer;//счетчик числа элементов
var
   n: integer;
begin
  n := 0;
  while l <> nil do 
    begin
      n := n + 1;
      l := l^.next;
    end;
  Counter := n;
end;
 
procedure CountList(l: tList);//подсчитать число элементов
begin
  writeln( 'Число элементов в списке равно ', Counter(l) );
  WhiteEnter;
end;
 
function GetElemByNumber(l : tList; n : Integer) : tList; // Вернуть n элемент от l
// Подразумевается, что элемент с номером n точно есть в списке!
begin
  while n > 1 do
    begin
      Dec(n);
      l := l^.next;
    end;
  GetElemByNumber := l;
end;
 
procedure Add1(var l: tList);//включение эл. после указанного
var
  i, k: integer;
  p: tPtr;
  D: tData;
begin
  if l = nil then
    WriteLn('Список пуст. Операция не возможна!')
  else
    begin
      i := Counter(l);
      write( 'Номер элемента (от 1 до ', i, '): ' ); readln(k);
      if (k<1)or(k>i) then
        WriteLn('Неверный номер элемента')
      else
        begin
          Write( 'Задайте значение элемента: ' ); readln(D);
          p := GetElemByNumber(l, k); // Получим по номеру
          p^.next := NewElem(D, p, p^.next); // За ним вставим новый
          if p^.next^.next <> nil then p^.next^.next^.prev := p^.next; // Исправим ссылочку
          WriteLn('После элемента (', k, ') ', p^.data, ' вставлен элемент ', D);
        end;
    end;  
  WhiteEnter;
end;
 
procedure Add2(var l: tList);//включение эл. перед указанным
var
  i, k: integer;
  p: tPtr;
  D: tData;
begin
  if l = nil then
    WriteLn('Список пуст. Операция не возможна!')
  else
    begin
      i := Counter(l);
      write( 'Номер элемента (от 1 до ', i, '): ' ); readln(k);
      if (k<1)or(k>i) then
        WriteLn('Неверный номер элемента')
      else
        begin
          Write( 'Задайте значение элемента: ' ); readln(D);
          p := GetElemByNumber(l, k); // Получим по номеру
          p^.prev := NewElem(D, p^.prev, p); // После него вставим новый
          if p^.prev^.prev <> nil then p^.prev^.prev^.next := p^.prev; // Исправим ссылочку
          if k = 1 then l := p^.prev; // А может это теперь голова списка
          WriteLn('Перед элементом (', k, ') ', p^.data, ' вставлен элемент ', D);
        end;
    end;  
  WhiteEnter;
end;
 
procedure DeleteElem(var l, p : tList);
var t : tList;
begin
  if p = l then // это голова
    begin
      l := l^.next; l^.prev := nil;
    end
  else if p^.next = nil then // это хвост
    begin
      t := p^.prev; t^.next := nil;
    end
  else // это где-то по середине
    begin
      t := p^.prev;
      t^.next := p^.next;
      t^.next^.prev := t;
    end;
  Dispose(p);
end;
 
procedure Exception(var l: tList);//исключение указанного эл.
var
  i : Integer;
  p : tPtr;
begin
  if l = nil then
    WriteLn('Список пуст. Операция не возможна!')
  else
    begin
      i := Counter(l);
      write( 'Номер элемента (от 1 до ', i, '): ' ); readln(k);
      if (k<1)or(k>i) then
        WriteLn('Неверный номер элемента')
      else
        begin
          p := GetElemByNumber(l, k); // Получим по номеру
          DeleteElem(l, p); // Удалим его
          WriteLn('Элемент ', k, ' удален.');
        end;
    end;  
  WhiteEnter;
end;
 
 
procedure ExcFoll(var l: tList);// исключение эл., следующего за данным
var
  i : Integer;
  p : tPtr;
begin
  if l = nil then
    WriteLn('Список пуст. Операция не возможна!')
  else
    begin
      i := Counter(l);
      write( 'Номер элемента (от 1 до ', i-1, '): ' ); readln(k);
      if (k<1)or(k>i-1) then
        WriteLn('Неверный номер элемента')
      else
        begin
          p := GetElemByNumber(l, k); // Получим по номеру
          DeleteElem(l, p^.next); // Удалим следующий
          WriteLn('Элемент ', k, ' удален.');
        end;
    end;  
  WhiteEnter;
end;
 
procedure ShowMenu;//показать меню
begin
   writeln( 'Операции с двунаправленным списком ' );
   writeln( '-------------------------------' );
   writeln( '1 - Заполнение         2 - Очистка ' );
   writeln( '3 - Вывод на экран   4 - Число элементов ' );
   writeln( '5 - Включение элемента после указанного' );
   writeln( '6 - Включение элемента перед указанным ' );
   writeln( '7 - Исключение указанного элемента ' );
   writeln( '8 - Исключение элемента, следующего за указанным ' );
   writeln( '0 - Выход ' );
   writeln( 'Выберите нужный пункт ' );
end;
 
var
   key: integer;//пункт меню
   l: tList;
begin
  Init(l);
  repeat
    writeln;
    ShowMenu;
    write( '>' );
    readln(key);
    case key of
      1: Fill(l); //заполнить список
      2: Clear(l); //очистить
      3: WriteList(l); //напечатать
      4: CountList(l); //подсчитать число элементов
      5: Add1(l); //включение эл. после указанного
      6: Add2(l); //включение эл. перед указанным
      7: Exception(l); //исключение указанного эл.
      8: ExcFoll(l); //исключение эл., следующего за указанным
      0:             {Пусто};
    end;
  until key = 0;
end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы