Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Двусв_Списки МУ.doc
Скачиваний:
7
Добавлен:
13.02.2015
Размер:
195.58 Кб
Скачать

СОДЕРЖАНИЕ

ЛИНЕЙНЫЕ ДВУСВЯЗНЫЕ СПИСКИ

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;