Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
30.04.2013
Размер:
46.59 Кб
Скачать

Семинар 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.

Задания для самостоятельной работы

  1. Сформировать двунаправленный линейный список. В списке найти элемент с минимальным значением. Удалить из списка элемент(ы), значение которых равно минимальному значению.

  2. После каждого отрицательного элемента списка поместить в список новое значение, равное ему по абсолютной величине.

  3. Преобразовать исходный список, переместив в его начало элементы с отрицательными значениями.

3

Соседние файлы в папке Семинары