Примеры задач
Однонаправленные списки
Сформировать файл из натуральных чисел и после каждого элемента соот-ветствующего списка вставить число 100. Методика решения
В разделе типов описываем ссылку на звено ss=^zveno, а затем само звено в виде записи, состоящей из информационной inf:byte и ссылочной next:ss частей. Для реализации данной программы понадобятся следующие переменные:
P– ссылка на текущее звено списка (тип ss); U – ссылка на заглавное звено списка; F – файловая переменная (file of byte); N – число типа longint. Описываем их в разделе переменных.
Процедура формирования списка
Считываем из файла числа и заносим в список следующим образом: Выделяем в памяти место под новое звено с адресом P^.sled,
![]()
Текущий указатель переводим на новое звено P:=P^. sled; ссылочной части этого звена присваиваем nil.
![]()
Таким же образом формируется следующее звено списка. И так пока не закончатся числа в файле. While not eof(f) do…
Процедура вставки звена в список
Процедура имеет два входных параметра: p – ссылка на звено, после которого производится вставка; m – помещаемое число. Создаём новое звено q, в его информационную часть заносим число m.
![]()
Далее, ссылочную часть нового звена переносим на звено p^.sled, а ссылку p^.sled на звено q. Графически это выглядит так:
q^.sled:= p^.sled; p^.sled:=q;
![]()
Процедура вывода списка на экран
Для вывода элементов списка на экран текущий указатель связываем с первым звеном списка. P:=U^. sled;
![]()
Выводим на экран информационную часть звена, на которое направлен указатель Р. Затем связываемся со следующим звеном, изменив значение Р на значение P^. sled. Снова выводим на экран информационную часть звена Р. Повторяем эти действия пока указатель Р не окажется в конце списка. While P<>nil do…
![]()
Основная часть программы
Теперь формируем файл из натуральных чисел. С помощью процедуры assign связываем файловую переменную с файлом, затем открываем его для записи rewrite(f); Признаком окончания формирования будет введение числа 0. Если вводится число не равное нулю, то его нужно записать в файл, считать следующее и повторять это в цикле пока считанное число не станет равно 0. While c<>0 do…
После формирования закрываем файл и снова открываем его уже для чтения. Reset(f); Выделяем память под заглавное звено списка new(u). Ссылочной части заглавного звена присваиваем nil. Текущий указатель, в начале, должен указывать на заглавное звено. P:=U
![]()
Далее, с помощью процедуры form, из элементов файла формируем список. Список сформирован. Далее, по условию задачи, идет вставка в списке числа 100 после каждого соответствующего элемента списка. Указателю p присваиваем ссылку на первое звено (u^.sled). В цикле, пока указатель p не пуст, вызываем процедуру vstavka (P,100) для вставки числа 100 после звена P. Выводим на экран измененный список с помощью процедуры print.
Uses Crt; Type Tinf=Longint; {описание списка} ss=^zveno; zveno=Record inf:Tinf; sled:ss; End; Var f:File Of Longint; {описание файловой переменной} u,p:ss; n:Longint; {Процедура формирования списка} Procedure form(c:Tinf); Begin New(p^.sled); p:=p^.sled; p^.inf:=c; p^.sled:=nil; inc(u^.inf) End; {Процедура вывода списка на экран} Procedure print; Var p:ss; Begin p:=u^.sled; While p<>nil Do Begin write(p^.inf,' '); p:=p^.sled; End; End; {Процедура вставки элемента в список} Procedure vstavka(p:ss;m:tinf); Var q:ss; Begin new(q);q^.inf:=m;q^.sled:=p^.sled;p^.sled:=q; End;
Begin ClrScr; {Связь с файловой переменной, открытие файла для записи} Assign(f,'Chisla'); ReWrite(f); Writeln('Введите натуральные числа, конец ввода 0'); Readln(n); While n<>0 Do Begin {формирование файла} Write(f,n); Readln(n); End; Close(f); Writeln('Исходный список:'); {Связь с файловой переменной, открытие файла для чтения} Assign(f,'Chisla'); Reset(f); New(u); u^.sled:=nil; p:=u; While Not Eof(f) Do Begin {чтение файла, формирование списка} Read(f,n); form(n); End; Close(f); {Вызов процедуры вывода списка на экран} print; Writeln; p:=u^.sled; While p<>nil Do Begin vstavka(p,100); p:=p^.sled^.sled; End; Writeln; print; Readkey; End.