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