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

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

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

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

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

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

Примечание. Каждое задание должно быть выполнено в двух вариантах. В первом варианте список должен быть сформирован по правилу стека, а во втором – очереди.

3

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