Линейные списки - Pascal (247572)

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

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

Представить одну из приведенную ниже таблицу в виде линейного списка L, элементами которого являются строки таблицы. Написать процедуры организа- ции, добавления элемента в список, исключения элемента из списка, просмотра списка, а также одну из процедур в соответствии с вариантом, приведенным ни- же. Значения и количество записей в таблице студент выбирает самостоятельно. Исходные данные после организации списка должны сохраняться в файле и при повторном запуске программы считываться из файла. Количество строк таблицы не задается. также нужно применить процедуру,которая удаляет первый элемент из непустого списка L ПОЖАЛУЙСТА,ПОМОГИТЕ((((

Решение задачи: «Линейные списки»

textual
Листинг программы
program Spisok;
 
type
  oc = record
    mat, ist, fiz: byte;
  end;
  tabl = record
    fam, im, ot: string[128];
    o: oc;
  end;
  Tinf = tabl;{тип данных, который будет храниться в элементе списка}
  List = ^TList;{Указатель на элемент типа TList}
  TList = record {А это наименование нашего типа "запись" обычно динамические структуры описываются через запись}
    data: TInf;  {данные, хранимые в элементе}
    next: List;   {указатель на следующий элемент списка}
  end;
 
{Процедура добавления нового элемента в односвязный список}
procedure AddElem(var spis1: List; znach1: TInf);
var
  tmp: List;
begin
  if spis1 = nil then {Проверяем не пуст ли список, если пуст, то }
  begin
    New(spis1);
    tmp := spis1;
  end
  else {в случае если список не пуст}
  begin
    tmp := spis1;
    while tmp^.next <> nil do
      tmp := tmp^.next; {ставим tmp на последний элемент списка}
    New(tmp^.next);
    tmp := tmp^.next;   {переносим tmp на новый элемент}
  end;
  tmp^.next := nil; {зануляем указатель}
  tmp^.data := znach1; {заносим значение}
end;
 
{процедура печати списка
полностью расписана при работе со стеком}
procedure Print(spis1: List);
begin
  if spis1 = nil then
  begin
    writeln('Список пуст.');
    exit;
  end;
  while spis1 <> nil do
  begin
    Write(spis1^.data, ' ');
    spis1 := spis1^.next
  end;
end;
 
{процедура удаления списка
 полностью расписана при работе со стеком}
procedure FreeStek(spis1: List);
var
  tmp: List;
begin
  while spis1 <> nil do
  begin
    tmp := spis1;
    spis1 := spis1^.next;
    Dispose(tmp);
  end;
end;
 
{процедура поиска в списке
 полностью расписана при работе со стеком}
function SearchElemZnach(spis1: List; znach1: TInf): List;
begin
  if spis1 <> nil then
    while (Spis1 <> nil) and (znach1 <> spis1^.data) do
      spis1 := spis1^.next;
  SearchElemZnach := spis1;
end;
 
{процедура удаления элемента
 полностью расписана при работе со стеком}
procedure DelElem(var spis1: List; tmp: List);
var
  tmpi: List;
begin
  if (spis1 = nil) or (tmp = nil) then
    exit;
  if tmp = spis1 then
  begin
    spis1 := tmp^.next;
    Dispose(tmp);
  end
  else
  begin
    tmpi := spis1;
    while tmpi^.next <> tmp do
      tmpi := tmpi^.next;
    tmpi^.next := tmp^.next;
    Dispose(tmp);
  end;
end;
 
{процедура удаления элемента по значению
 полностью расписана при работе со стеком}
procedure DelElemZnach(var Spis1: List; znach1: TInf);
var
  tmp: List;
begin
  if Spis1 = nil then
  begin
    Writeln('Список пуст');
    exit;
  end;
  tmp := SearchElemZnach(spis1, znach1);
  if tmp = nil then
  begin
    writeln('Элемент с искомым значением ', znach1, ' отсутствует в списке.');
    exit;
  end;
  DelElem(spis1, tmp);
  Writeln('Элемент удалён.');
end;
 
{процедура удаления элемента по позиции
 полностью расписана при работе со стеком}
procedure DelElemPos(var spis1: List; posi: integer);
var
  i: integer;
  tmp: List;
begin
  if posi < 1 then
    exit;
  if spis1 = nil then
  begin
    Write('Список пуст');
    exit
  end;
  i := 1;
  tmp := spis1;
  while (tmp <> nil) and (i <> posi) do
  begin
    tmp := tmp^.next;
    inc(i)
  end;
  if tmp = nil then
  begin
    Writeln('Элемента с порядковым номером ', posi, ' нет в списке.');
    writeln('В списке всего ', i - 1, ' элемента(ов).');
    exit
  end;
  DelElem(spis1, tmp);
  Writeln('Элемент удалён.');
end;
 
 
 
var
  Spis, tmpl: List;
  znach: tabl;
  n, i: integer;
  f: file of tabl;
 
begin
  Spis := nil;
  assign(f, 'data.dat');
  rewrite(f);
  write('Введите количество добавляемых элементов: ');
  readln(n);
  writeln('Введите значения добавляемых элементов: ');
  for i := 1 to n do
  begin
    write('Введите фамилию: ');
    readln(znach.fam);
    write('Введите имя: ');
    readln(znach.im);
    write('Введите отчество: ');
    readln(znach.ot);
    write('Введите оценку по математике: ');
    readln(znach.o.mat);
    write('Введите оценку по истории: ');
    readln(znach.o.ist);
    write('Введите оценку по физике: ');
    readln(znach.o.fiz);
    AddElem(Spis, znach);
    write(f, znach);
  end;
  close(f);
  writeln('Данные в файл записаны успешно.');
  
  Spis := nil;
  reset(f);
  while not eof(f) do
  begin
    read(f, znach);
    AddElem(Spis, znach);
  end;
  close(f);
  writeln('Данные из файла:');
  Print(Spis);
  writeln;
  Write('Введите порядковый номер удаляемого элемента: ');
  readln(n);
  DelElemPos(Spis, n);
  Print(Spis);
  FreeStek(Spis);
end.

Объяснение кода листинга программы

  1. Объявление переменных:
    • Spis, tmpl: List;
    • znach: tabl;
    • n, i: integer;
    • f: file of tabl;
  2. Инициализация переменной Spis значением nil.
  3. Открытие файла 'data.dat' в режиме записи (перезаписи).
  4. Ввод количества добавляемых элементов.
  5. Ввод данных для каждого элемента (фамилия, имя, отчество, оценка по математике, оценка по истории, оценка по физике) и добавление элемента в список Spis с помощью процедуры AddElem.
  6. Запись данных в файл с помощью оператора write и функции readln.
  7. Закрытие файла.
  8. Вывод сообщения о успешной записи данных в файл.
  9. Открытие файла 'data.dat' в режиме чтения.
  10. Чтение данных из файла в переменную znach с помощью оператора read и функции readln.
  11. Добавление элемента в список Spis с помощью процедуры AddElem.
  12. Печать списка Spis с помощью процедуры Print.
  13. Вызов процедуры FreeStek для освобождения памяти, выделенной под элементы списка Spis.
  14. Ввод порядкового номера удаляемого элемента.
  15. Вызов процедуры DelElemPos для удаления элемента из списка Spis по указанному порядковому номеру.
  16. Печать списка Spis после удаления элемента.
  17. Вызов процедуры FreeStek для освобождения памяти, выделенной под элементы списка Spis.

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


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

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

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