Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум ОА и П.doc
Скачиваний:
23
Добавлен:
29.08.2019
Размер:
13.34 Mб
Скачать

Задание 2

Напишите программу, которая использует добавление, поиск, удаление и вывод узлов динамического списка.

Program dinlist1;

type

s_name=string[20];

p_student=^student;

student=record

name: s_name;

next: p_student;

end;

var

head: p_student; {начало списка}

buf: s_name; {буфер для ввода с клавиатуры}

{добавления в начало списка}

procedure AddToList (var head: p_student; name: s_name);

var

curr: p_student;

begin

new (curr);

curr^ .name:=name;

curr^ .next:=head;

head:=curr;

end;

{вывод списка}

procedure PrintList (p: p_student);

var

curr: p_student;

begin

curr:=p;

while curr<>nil do begin

writeln (curr^. name);

curr:=curr^. next;

end;

end;

{удаление узла из списка}

function DelNode (var head: p_student; name: s_name): Boolean;

var

curr: p_student;

p: p_student;

done: Boolean;

begin

p:=nil;

curr:=head;

done:=FALSE;

while (done=FALSE) and (curr<>nil) do begin

if curr^. name=name

then begin

if p=nil

then head:=curr^. next

else p^.next:=curr^. next;

done:=TRUE;

end

else begin

p:=curr;

curr:=curr^. next;

end;

end;

DelNode:=done;

end;

{основная программа}

begin

repeat

write (‘Фамилия->’);

readln (buf);

if length (buf)<>0

then AddToList (head, buf);

until length (buf)=0;

writeln (‘** Введенный список **’);

PrintList (head);

writeln (‘** Удаление из списка **’);

repeat

write (‘Фамилия->’);

readln (buf);

if length (buf)<>0 then

if DelNode (head, buf)

then writeln (‘Элемент” ‘, buf, ‘ “удален из списка’)

else writeln (‘Элемента” ‘, buf, ‘”в списке нет’);

until length (buf)=0;

writeln (‘** Список после удаления узлов **’);

PrintList (head);

end.

Вот пример работы программы:

Фамилия-> Иванов

Фамилия-> Петров

Фамилия-> Васильев

Фамилия-> Андреев

Фамилия->

** Введенный список **

Андреев

Васильев

Петров

Иванов

** Удаление из списка **

Фамилия-> Андреев

Элемент “Андреев” удален из списка

Фамилия-> Петров

Элемент “Петров” удален из списка

Фамилия-> Сидоров

Элемента “Сидорова” в списке нет

Фамилия->

** Список после удаления узлов **

Васильев

Иванов

Задание для самостоятельного решения.

Напишите программу, которая формирует упорядоченный список студентов по убыванию. Порядок следования записей в списке определяется содержимым поля name.

Лабораторная работа №16. Тема: «Разработка алгоритмов и программ с использованием динамических структур данных».

Цель работы: получение навыков составления программ на языке Pascal с использованием динамических структур данных.

Краткие теоретические сведения

Динамической переменной называется переменная, память которой выделяется во время работы программы. Выделение памяти для динамической переменной осуществляется вызовом процедуры new. У процедуры new один параметр – указатель на переменную определенного типа, память для которой надо выделить. Например, если р – указатель на переменную типа real, то в результате выполнения new (p); будет создана переменная типа real, и переменная-указатель р будет содержать адрес этой переменной.

У динамической переменной нет имени, поэтому обратиться к ней можно только при помощи указателя.

Следующая программа демонстрирует создание и использование динамических переменных.

Program p;

Var

p1, p2, p3: ^integer;

begin

{указатели р1, р2, р3 существуют и их значения - nil}

new (p1); {создадим переменную типа integer и ее адрес присвоим переменной р1}

new (p2);

new (p3);

{существуют указатели р1, р2, р3 и три переменные типа integer}

write (‘Введите два целых числа через пробел и нажмите <Enter>’);

readln (p1^, p2^);

p3^:=p1^+p2^;

writreln (‘Сумма введенных чисел равна’, p3^);

end.

Связанные списки.

Указатели и динамические переменные позволяют создавать сложные динамические структуры данных, такие как связанные списки и деревья.

Связанный вписок можно изобразить графически, (рис. 13).

рис. 13

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

Чтобы программа могла использовать список, надо определить тип компонентов списка и переменную-указатель на первый элемент списка. Вот пример объявления списка студентов:

type

{связь между элементами списка}

p_stud=^student;

{описание типа элемента списка}

student=record

surname: string[20]; {фамилия}

name: string[20]; {имя}

group: integer; {номер группы}

address: string[60]; {домашний адрес}

next: p_stud; {указатель на следующий элемент списка}

end;

var

head: p_stud; {указатель на первый элемент списка}

Добавлять данные можно в начало, в конец или в нужное место списка. Во всех этих случаях необходимо корректировать указатели. На следующем рисунке изображен процесс добавления элементов в начало односвязного списка, (рис. 14).

h

NIL

ead

список пустой: head ни на что не указывает

head

после добавления одного элемента head

указывает на этот элемент

h ead

после добавления второго элемента в начало

списка head указывает на этот элемент

рис. 14