New(x);
x^.Data := Digit;
px^.Next := x;
x^.Next := dx;
Приведем процедуру InsInto, которая ищет место в списке и вставляет элемент, переданный ей как параметр. В результате сразу получается упорядоченный список. Адрес первого элемента списка хранится в глобальной переменной Head.
Procedure InsInto(Digit : integer; Var Head : Ukazatel );
Var
dx, px, x : Ukazatel ;
Begin
New(x);
x^.Data := Digit;
x^.Next := Nil;
if Head = Nil
then {Если список пуст, то вставляем первый элемент}
Head := x
else
{Если список не пуст, то просматриваем его до тех пор, пока не отыщется подходящее место для x^ или не закончится список}
Begin
dx := Head;
px := Head;
while (px<>Nil) and (px^.Data<=Digit) do
Begin
dx := px;
px :=px^.Next;
End;
if px=Nil
then {Пройден весь список}
dx^.Next := x {Элемент добавляется в конец списка}
else {Пройден не весь список}
Begin
x^.Next := px;
if px=Head
then
Head := x {Вставляем в начало списка}
else
dx^.Next := x; {Вставляем внутрь списка}
End;
End;
End;
Задание. Создайте программу, формирующую упорядоченный список, вставив в нее рассмотренную выше процедуру и процедуру просмотра и вывода на экран элементов списка. Отладьте программу, добавьте комментарий, покажите учителю результат для оценки.
Занятие 4-5. Примеры задач, решаемых с помощью списка. Решение задач.
Задание. Просмотрите предложенные решения задач и приготовьтесь объяснить алгоритм их решения учителю. Если необходимо, то наберите программы на компьютере и просмотрите их действие.
Задача 1. Проверить есть ли и сколько раз встречается список М1 в списке М2.
Program BaranovA;
Uses
Crt;
Type
EXS = ^ S;
S = Record
Data : integer;
Next : EXS;
End;
Var
u, x, m1, m2 : EXS;
i, Kol : integer;
Procedure Poisk(Var x1, x2 : EXS);
Var
m3, m4 : EXS;
Begin
Kol := 0;
m3 := m1;
m4 := m2;
while m4 <> Nil do
Begin
if m4^.Data = m3^.Data
then
Begin
m3 := m3^.Next;
m4 := m4^.Next;
if m3 = Nil
then
Begin
Kol := Kol+1;
m3 := m1;
End;
End;
else
Begin
m3 := m1;
m4 := m4^.Next;
End;
End;
End;
Procedure Init (Var u : EXS);
Var
y : EXS;
Digit : integer;
Begin
Writeln('Введите список. Конец ввода – 0');
u := Nil;
Read(Digit);
while Digit <> 0 do
Begin
New(y);
y^.Next := Nil;
y^.Data := Digit;
if u = Nil
then
u := y
else
x^.Next := y;
x := y;
Read(Digit);
End;
Writeln;
End;
Procedure Print(X : EXS);
Begin
while X <> Nil do
Begin
Write(X^.Data : 5);
X := X^.Next;
End;
Readln;
Writeln;
End;
Begin
ClrScr;
Init(m1);
Init(m2);
Writeln('***Список 1***');
Print(m1);
Writeln('***Список 2***');
Print(m2);
Poisk(m1, m2);
Writeln('Список 1 встречается в списке 2 ', Kol, ' раз(а)');
Readln;
End.
Задача 2. Из текстового файла, состоящего из строк, сформировать список, запросить слово и удалить это слово из списка.
Program ;
Uses
Crt;
Type
EXS = ^ Spisok;
Spisok = Record
Data : string;
Next : EXS;
End;
Var
Golova_Spiska, Golova_Spiska_Udalen_ : EXS;
F : text;
S, St : string;
Procedure Smotr(x : EXS);
Begin
TextColor(LightRed);
Write('Ваш список...');
while x <> Nil do
Begin
Writeln (x^.Data,' ');
x := x^.Next;
End;
End;
Procedure Reading;
Begin
Reset (F);
Writeln('Ваш файл...');
while no Eof(F) do
Begin
Readln (F, St);
Writeln (St);
End;
close (F);
End;
Procedure CreateFile;
Begin
Writeln('Создание файла');
Write('Введите имя файла...');
Readln(S);
Assign (F, S);
rewrite('Вводите текст в файл (окончание ввода - <Enter>');
Repeat
Readln(St);
Writeln (F, St);
until St = '';
Write('Файл создан');
close (F);
Reading;
End;
Procedure Proverka;
Var
x, y, u : EXS;
i : integer;
Begin
Reset (F);
while not Eof (F) do
Begin
Readln (F, St[i]);
while i < Length (St) do
Begin
New (x);
x^.Next := Nil;
if (St[i] <> '') or (St[i] <> St[Length(St)])
then
x^.Data := x^.Data + St[i];
if u = Nil
then
u := x
else
y^.Next := x;
y := x;
End;
End;
close (F);
Smotr (u);
End;
Begin
ClrScr;
TextColor (White);
CreateFile;
Proverka;
End.
Выберите с учителем задачи для самостоятельного решения.
1. Написать программу, содержащую процедуру, которая меняет местами первый и второй элементы непустого списка. Если элементы не найдены, то выдать на экран соответствующие сообщение.
2. Написать программу, содержащую процедуру, которая меняет местами первый и пятый элементы непустого списка. Если элементы не найдены, то выдать на экран соответствующие сообщение.
3. Написать программу, содержащую процедуру, которая меняет местами первый и последний элементы непустого списка. Если элементы не найдены, то выдать на экран соответствующие сообщение.
4. Написать программу, содержащую процедуру, которая вставляет новый элемент перед каждым вхождением заданного элемента. Если элементы не найдены, то выдать на экран соответствующие сообщение.
5. Написать программу, содержащую процедуру, которая вставляет новый элемент за каждым вхождением заданного элемента. Если элементы не найдены, то выдать на экран соответствующие сообщение.
6. Написать программу, содержащую подпрограмму, которая проверяет на равенство списки М1 и М2.
7. Написать программу, содержащую функцию, которая определяет, входит ли список М1 в список М2. Предполагается, что списки существуют.
8. Написать программу, содержащую подпрограмму, которая копирует в конец непустого списка М его первый элемент. Если элементы не найдены, то выдать на экран соответствующие сообщение.
9. Написать программу, содержащую подпрограмму, которая копирует в начало непустого списка М его последний элемент. Если элементы не найдены, то выдать на экран соответствующие сообщение.
10. Написать программу, содержащую процедуру, которая копирует в список М за каждым вхождением заданного элемента все элемента списка М1.
11. Написать программу, содержащую процедуру, которая объединяет два упорядоченных по неубыванию списка М1 и М2 в один упорядоченный по неубыванию список, построив новый список М.
12. Написать программу, содержащую процедуру, которая объединяет два упорядоченных по неубыванию списка М1 и М2 в один упорядоченный по неубыванию список, сменив соответствующим образом ссылки в М1 и М2.
13. Написать программу, содержащую функцию, которая проверяет, упорядочены ли элементы списка по алфавиту.
14. Напишите программу сортировки существующего списка по алфавиту. В программе используйте подпрограммы.
15. Напишите программу, которая создавала бы файл целых чисел, а затем формировала список целых чисел файла. Создайте в конце списка элемент, содержащий сумму всех чисел файла. В программе используйте подпрограммы.
16. Напишите программу, которая создавала бы файл целых чисел, а затем формировала список целых чисел файла. Создайте список чисел, являющихся суммой соседних элементов. В программе используйте подпрограммы.
17. Напишите программу, которая создавала бы текстовый файл, а затем формировала список строк файла. Создайте список обратных строк. В программе используйте подпрограммы.
18. Напишите программу, которая создавала бы текстовый файл, а затем формировала список строк файла. Создайте отсортированный список строк. В программе используйте подпрограммы.
19. Напишите программу, которая создавала бы файл комбинированного типа, а затем формировала список, используя какое-либо поле записи. Создайте отсортированный список. В программе используйте подпрограммы.
20. Напишите программу, которая создавала бы файл комбинированного типа, а затем формировала список элементов файла. Создайте отсортированный по какому-либо полю список. В программе используйте подпрограммы.
Занятие 6. Удаление элемента из списка.
В результате решения задач предыдущих занятий, Вы научились создавать различными способами список, анализировать его информационную часть, формировать на базе данного списка другой список и т. д.
Поэтому для решения поставленной перед нами задачи удаления некоторого элемента из списка, нам нужно найти по какому-либо признаку этот элемент, что, надеюсь не составит для Вас труда.
Уточним поставленную перед нами задачу: удалить из списка элемент с заданной информационной частью.
Обозначим Head – исходный список, Digit – значение информационной части удаляемого элемента.
При исследовании списка на наличие в нем заданного элемента может встретиться три различных случая. Рассмотрим их.
Удаление элемента из начала списка
Изобразим удаление графически:


Напишем фрагмент программы:
x := Head; {Запомним адрес первого элемента списка}
Head := Head^.Next; {Теперь Head указывает на второй элемент списка}
Dispose(x); {Освободим память, занятую переменной x^}
Удаление элемента из середины списка
Для этого нужно знать адреса удаляемого элемента и элемента, находящегося в списке перед ним.
Изобразим удаление графически:


x := Head; {Переменная х для хранения адреса удаляемого элемента}
{Найдем адреса нужных элементов списка}
while (x<>Nil) and (x^.Data<>Digit) do
Begin
dx := x;
x := x^.Next
End;
dx^.Next := x^.Next;
Dispose(x);
Удаление элемента из конца списка
Удаление элемента из конца списка производится, когда указатель dx показывает на предпоследний элемент списка, а х – на последний.
Изобразим удаление графически:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |


