- •1 Линейные двусвязные списки
- •2 Основные операции над списком
- •2.1 Добавление элемента в список
- •2.2 Удаление элемента из списка
- •2.3 Вставка элемента внутри списка
- •3 СоЗдание, просмотр и уничтожение списка
- •Упражнения
- •4 Поиск элемента в списке
- •5 Перемещение элементов списка
- •Упражнения
- •6 Примеры обработки списка
- •Упражнение
- •Упражнение
- •Упражнения
- •Литература
СОДЕРЖАНИЕ
ЛИНЕЙНЫЕ ДВУСВЯЗНЫЕ СПИСКИ
1 Линейные двусвязные списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
4 |
2 Основные операции над списком . . . . . . . . . . . . . . . . . . . . . . . . . |
5 |
2.1 Добавление элемента в список . . . . . . . . . . . . . . . . . . . . . . . . |
6 |
2.2 Удаление элемента из списка . . . . . . . . . . . . . . . . . . . . . . . . . |
6 |
2.3 Вставка элемента внутри списка. . . . . . . . . . . . . . . . . . . . . |
10 |
3 Создание, просмотр и уничтожение списка . . . . . . . . . . . . . . . . . |
11 |
4 Поиск элемента в списке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
13 |
5 Перемещение элементов списка . . . . . . . . . . . . . . . . . . . . . . . . . . |
14 |
6 Примеры обработки списка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
17 |
Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
30 |
1 Линейные двусвязные списки
Линейный двусвязный список – представление последовательности данных одного типа в виде упорядоченной совокупности элементов (звеньев), в которой каждый элемент содержит поле (или поля) с информацией и два поля указателей (ссылки) со значениями адресов предыдущего и следующего элементов.
Ссылки на предыдущий элемент первого звена и на следующий элемент последнего звена линейного двусвязного списка содержат значение nil.
Операции над линейными двусвязными списками будут рассмотрены на примере списка целых чисел.
Звено списка имеет тип rec , а указатель на звено – тип link :
type link=^rec;
rec=record
inf:integer; {поле информации}
prev, {указатель на предыдущий элемент}
next:link {указатель на следующий элемент}
end;
Указатели first и last типа link содержат соответственно адреса первого и последнего звеньев линейного двусвязного списка.
Линейный двусвязный список можно просматривать как с начала, так и с конца, и с любой стороны можно добавлять и удалять элементы.
Расход дополнительной памяти (на дополнительную ссылку) компенсируется эффективностью операций удаления и вставки элементов внутри списка.
В указаниях рассматриваются только линейные двусвязные списки, поэтому термин список будет использоваться для описания именно линейного двусвязного списка.
2 Основные операции над списком
Основные операции для линейного двусвязного списка, кроме создания пустого списка, оформлены в виде подпрограмм (процедур или функций).
Параметры подпрограмм first и last (указатели на начало и конец списка) задаются как параметры–значения в тех случаях, когда адреса первого и последнего элементов списка остаются неизменными, хотя внутри списка ссылки могут меняться, как и значения полей элементов списка.
Параметр–указатель (first или last) задается как параметр–переменная (с ключом var), если в подпрограмме значение указателя может меняться и это изменение должно быть передано в вызывающую программу.
В подпрограммах добавления элемента в список (в начало списка или в его конец) и вставки элемента внутри списка в качестве параметра–значения используется целая переменная x – значение информационного поля нового элемента.
Создание пустого списка
first:=nil; last:=nil;
Создание первого элемента
procedure First_El(var first, last: link; x:integer);
begin
new(first); first^.inf:=x;
first^.prev:=nil; first^.next:=nil;
last:=first
end;
2.1 Добавление элемента в список
Добавление элемента в конец линейного двусвязного списка
procedure DAdd_last(var first, last : link; x:integer);
var p:link; {указатель на новый элемент}
begin
new(p);
p^.inf:=x;
p^.prev:=last;
p^.next:=nil;
if last<>nil then last^.next:=p
else first:=p;
last:=p
end;
Добавление элемента в конец непустого списка
procedure DAdd_last1(var last: link; x:integer);
begin
new(last^.next);
last^.next^.inf:=x;
last^.next^.prev:= last;
last^.next^.next:= nil;
last:= last^.next
end;
Добавление элемента в начало линейного двусвязного списка
procedure DAdd_first(var first, last : link; x:integer);
var p:link; {указатель на новый элемент}
begin
new(p);
p^.inf:=x;
p^.prev:=nil;
p^.next:=first;
if first<>nil then first^.prev:=p
else last:=p;
first:=p
end;
Добавление элемента в начало непустого списка
procedure DAdd_first1(var first: link; x:integer);
begin
new(first^.prev);
first^.prev^.inf:=x;
first^.prev^.prev:=nil;
first^.prev^.next:=first;
first:= first^.prev
end;