- •Содержание
- •5. Задания для контрольной работы
- •5. Учебно-методическое обеспечение дисциплины Библиографический список
- •Приложение 1 Определение номера варианта
- •Приложение 2 Теоретический материал Указатели
- •Однонаправленный список
- •Реализация списка на языке Пескаль
- •Реализация алгоритмов обработки списков
- •Приложение 3 Пример выполнения контрольной работы
- •Приложение 4 Оформление титульного листа
Приложение 3 Пример выполнения контрольной работы
Задание:Дан текстовый файл содержащий целые числа. Считать данные из текстового файла в однонаправленный список. Удалить из списка первый нулевой элемент. Вывести список после удаления на экран.
Исходные данные:
f: filetext– файловая переменная для работы с текстовым файлом;
elem – запись, описывающая тип элементов однонаправленного списка;
ptr– новый тип - указатель на записьelem;
an: ptr– указатель начало однонаправленного списка.
Порядок выполнения задания.
Создать в Блокноте текстовый файл file.txt, содержащий целые числа.
Создать папку, в которой будет содержаться проект.
Разместить файл file.txtв этой папке.
Создать консольное приложение в среде Delphi(задание можно выполнить в любых версиях языка Паскаль).
Листинг программы:
type
type_inf = integer;{тип информационной части - integer}
ptr = ^elem; ;{тип указатель типа elem}
{тип запись элемент однонаправленного списка}
elem = record
inf: type_inf; {информационное поле}
next: ptr; {адресная часть}
end;
{описание переменных}
var k,an,ak,am,l:ptr;
val:type_inf;
f:textfile;
var fil:string;
flag:boolean;
begin
fil:='file.txt';{переменная, содержащая имя файла}
assignfile(f,fil); {связь файловой переменной с именем файла}
reset(f);{открытие файла для чтения}
read(f,val); {чтение первого числа}
{заполнение однонаправленного списка}
new(an); {выделение памяти для первого элемента списка}
an^.inf:=val; {заполнение информационного поля}
ak:=an; {задание адреса последнего элемента}
ak^.next:=nil; {задание адресной части последнего элемента}
while not(eof(f)) do {пока не закончились данные в файле}
begin
new(k); {выделение памяти для текущего элемента списка}
read(f,val); {чтение очередного числа из файла}
{заполнение информационного поля текущего элемента}
k^.inf:=val;
{запись адреса текущего элемента в адресную часть последнего
элемента}
ak^.next:=k;
{задание адресной части текущего элемента, как последнего элемента}
k^.next:=nil;
ak:=k; {переписать адрес текущего элемента в последний элемент}
end;
{вывод информационной части элементов списка}
k:=an; {задать начало списка}
while k<>nil do {пока не закончились элементы списка}
begin
val:=k^.inf;
writeln(val); {вывод информационного поля текущего элемента}
k:=k^.next; {переход к следующему элементу списка}
end;
{Поиск первого нулевого элемента}
flag:=false; {логическая переменная, определяющая, найден ли нулевой элемент в списке}
k:=an; {задать начало списка}
{пока не закончились элементы списка или не найден нулевой элемент}
while(not flag) and ( k<>nil) do
begin
if (k^.inf=0) then {если найден нулевой элемент}
begin
am:=k; {запомнить адрес нулевого элемента}
flag:=true; {задать флаг, что нулевой элемент найден}
end;
k:=k^.next {переход к следующему элементу списка}
end;
if (flag=true) and (am^.next=nil) then
{если найденный нулевой элемент - последний}
begin
{находим элемент, предшествующий последнему}
k:=an; {задать начало списка}
{пока не дошли до элемента, стоящего перед последним}
while k^.next <> am do
k:=k^.next; {переход к следующему элементу списка}
l:=k; {запомнить адрес предпоследнего элемента}
{записать в адресную часть предпоследнего элемента nil}
l^.next:=nil;
dispose(am); {удалить из памяти нулевой элемент}
end
else
if am=an then {если нулевой элемент - первый}
begin
{переписать адрес второго элемента в первый}
an:=an^.next;
dispose(am); {удалить из памяти нулевой элемент}
end
else
if (flag=true) then
{если нулевой элемент в средине с писка}
begin
{находим элемент предществующий нулевому}
k:=an; {задать начало списка}
{пока не дошли до элемента, стоящего перед нулевым}
while k^.next <> am do
k:=k^.next; {переход к следующему элементу списка}
{запомнить адрес элемента, предшествующего нулевому
элементу}
l:=k;
{переписать в адресную часть элемента предшествующего
нулевому адресную часть нулевого элемента}
l^.next:=am^.next;
dispose(am); {удалить из памяти нулевой элемент}
end
else
writeln(‘Нулевого элемента нет’);
readln;
{вывод списка после удаления}
k:=an;
while k<>nil do
begin
val:=k^.inf;
writeln(val);
k:=k^.next;
end;
readln;
end.
Результат работы программы.
Файл file.txt:
Вывод данных