Семинар 3
Тема занятия. Динамические переменные. Однонаправленные списки.
Задание
Разработать программу, которая вводит из текстового файла последовательность вещественных чисел, размещает эти числа в виде однонаправленного линейного списка организованного по правилу стека, а затем удаляет из списка все числа, превышающие среднее арифметическое чисел введенной последовательности.
Program Ex_3;
Uses Crt;
Type Tspisok=^spisok;{Тип “указатель на элемент”}
spisok=record
info: real; {число}
prev: Tspisok; {Указатель следующий элемент списка}
end;
Var Head: Tspisok; {Указатель на вершину стека.}
P: Tspisok; {Текущее значение указателя на элемент списка}
Prev: Tspisok;
F: Text;
Sum, SAr: Real;
N: Byte; {Число элементов в списке}
Begin
ClrScr;
Writeln(‘Введите имя файла с исходными данными - Data’);
Assign(F,’Data.txt’);
Reset(F);
{Ввод исходных данных из текстового файла.}
Head:= Nil;
N:=0;
While Not EOF(f) do
Begin
New(P); {Выделение памяти для размещение очередного элемента списка}
Readln(F, P^.info);
P^.Prev:= Head; {Определение значения указателя на предыдущий элемент списка}
Head:=P; {Определение значения указателя на вершину списка}
End;
{Вывод элементов исходного списка}
Writeln(‘Исходный список’);
P:=Head;
While P<>Nil do
Begin
Write(P^.info:5:1);
P:=P^.prev;
End;
Writeln;
{Определение среднего арифметического значение элементов списка}
P:= Head;
While P<> nil do
Begin
Sum:=Sum+P^.info;
P:=P^.Prev;{Переход к следующему элементу списка}
N:=N+1;
End;
Sar:= Sum/ N;
Writeln(‘Среднее арифметическое равно ’,Sar:5:1)
{Удаление из вершины списка элементов, значение которых больше среднего арифметического значения}
While (Head^.Info> Sar) and (Head<>Nil) do
Begin
P:=Head;
Head:=Head^.prev; {Перемещаем указатель на следующий элемент списка}
Dispose (P); {Удаляем из памяти значение указателя}
End;
If Head<> Nil Then {Список не “пустой”}
Begin
{Удаление из списка элементов, значение которых больше среднего арифметического значения}
Prev:=Head;
P:=Head^.Prev;
While P<>Nil Do
If P^.Info>Sar Then
Begin
{Удаление элемента из списка}
Prev^.Prev:=P^.Prev; {Изменяет значение поля указателя}
Dispose(P);
P:= Prev^.Prev;
End
Else
Begin
Prev:=P;
P:=P^.Prev; {Переход к следующему элементу списка}
End;
{Вывод элементов списка после удаления элементов}
Writeln(‘Исходный список’);
P:=Head;
While P<>Nil do
Begin
Write(P^.info:4:1);
P:=P^.prev;
End;
End;
End.
Задания для самостоятельной работы
-
Сформировать однонаправленный линейный список. В списке найти элемент с минимальным значением. Удалить из списка элемент(ы), значение которых равно минимальному значению.
-
После каждого отрицательного элемента списка поместить в список новое значение, равное ему по абсолютной величине.
-
Преобразовать исходный список, переместив в его начало элементы с отрицательными значениями.
Примечание. Каждое задание должно быть выполнено в двух вариантах. В первом варианте список должен быть сформирован по правилу стека, а во втором – очереди.
