рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Применение линейных списков

Применение линейных списков - раздел Образование, ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ. СВЯЗНЫЕ СПИСКИ Линейные Списки Находят Широкое Применение В Приложениях, Где Непред...

Линейные списки находят широкое применение в приложениях, где

непредсказуемы требования на размер памяти, необходимой для хра-

нения данных; большое число сложных операций над данными, особен-

но включений и исключений. На базе линейных списков могут строит-

ся стеки, очереди и деки. Представление очереди с помощью

линейного списка позволяет достаточно просто обеспечить любые же-

лаемые дисциплины обслуживания очереди. Особенно это удобно, ког-

да число элементов в очереди трудно предсказуемо.

В программном примере 5.8 показана организация стека на од-

носвязном линейном списке. Это пример функционально аналогичен

примеру 4.1 с той существенной разницей, что размер стека здесь

практически неограничен.

Стек представляется как линейный список, в котором включение

элементов всегда производятся в начала списка, а исключение -

также из начала. Для представления его нам достаточно иметь один

указатель - top, который всегда указывает на последний записанный

в стек элемент. В исходном состоянии (при пустом стеке) указатель

top - пустой. Процедуры StackPush и StackPop сводятся к включению

и исключению элемента в начало списка. Обратите внимание, что при

включении элемента для него выделяется память, а при исключении -

освобождается. Перед включением элемента проверяется доступный

объем памяти, и если он не позволяет выделить память для нового

элемента, стек считается заполненным. При очистке стека последо-

вательно просматривается весь список и уничтожаются его элементы.

При списковом представлении стека оказывается непросто определить

размер стека. Эта операция могла бы потребовать перебора всего

списка с подсчета числа элементов. Чтобы избежать последователь-

ного перебора всего списка мы ввели дополнительную переменную

stsize, которая отражает текущее число элементов в стеке и кор-

ректируется при каждом включении/исключении.

{==== Программный пример 5.8 ====}

{ Стек на 1-связном линейном списке }

unit Stack;

Interface

type data = ...; { эл-ты могут иметь любой тип }

Procedure StackInit;

Procedure StackClr;

Function StackPush(a : data) : boolean;

Function StackPop(Var a : data) : boolean;

Function StackSize : integer;

Implementation

type stptr = ^stit; { указатель на эл-т списка }

stit = record { элемент списка }

inf : data; { данные }

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

end;

Var top : stptr; { указатель на вершину стека }

stsize : longint; { размер стека }

{** инициализация - список пустой }

Procedure StackInit;

begin top:=nil; stsize:=0; end; { StackInit }

{** очистка - освобождение всей памяти }

Procedure StackClr;

var x : stptr;

begin { перебор эл-тов до конца списка и их уничтожение }

while top<>nil do

begin x:=top; top:=top^.next; Dispose(x); end;

stsize:=0;

end; { StackClr }

Function StackPush(a: data) : boolean; { занесение в стек }

var x : stptr;

begin { если нет больше свободной памяти - отказ }

if MaxAvail<SizeOf(stit) then StackPush:=false

else { выделение памяти для эл-та и заполнение инф.части }

begin New(x); x^.inf:=a;

{ новый эл-т помещается в голову списка }

x^.next:=top; top:=x;

stsize:=stsize+1; { коррекция размера }

StackPush:=true;

end;

end; { StackPush }

Function StackPop(var a: data) : boolean; { выборка из стека }

var x : stptr;

begin

{ список пуст - стек пуст }

if top=nil then StackPop:=false

else begin

a:=top^.inf; { выборка информации из 1-го эл-та списка }

{ 1-й эл-т исключается из списка, освобождается память }

x:=top; top:=top^.next; Dispose(top);

stsize:=stsize-1; { коррекция размера }

StackPop:=true;

end; end; { StackPop }

Function StackSize : integer; { определение размера стека }

begin StackSize:=stsize; end; { StackSize }

END.

Программный пример для организация на односвязном линейном

списке очереди FIFI разработайте самостоятельно. Для линейного

списка, представляющего очередь, необходимо будет сохранять: top

- на первый элемент списка, и bottom - на последний элемент.

Линейные связные списки иногда используются также для предс-

тавления таблиц - в тех случаях, когда размер таблицы может су-

щественно изменяться в процессе ее существования. Однако, то обс-

тоятельство, что доступ к элементам связного линейного списка

может быть только последовательным, не позволяет применить к та-

кой таблице эффективный двоичный поиск, что существенно ограничи-

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

может помочь в организации поиска, задачи сортировки таблиц,

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

реже, чем для таблиц в векторном представлении. Однако, в некото-

рых случаях для таблицы, хотя и не требуется частое выполнение

поиска, но задача генерации отчетов требует расположения записей

таблицы в некотором порядке. Для упорядочения записей такой таб-

лицы применимы любые алгоритмы из описанных нами в разделе 3.9.

Некоторые алгоритмы, возможно, потребуют каких-либо усложнений

структуры, например, быструю сортировку Хоара целесообразно про-

водить только на двухсвязном списке, в цифровой сортировке удобно

создавать промежуточные списке для цифровых групп и т.д. Мы приве-

дем два простейших примера сортировки односвязного линейного

списка. В обоих случаях мы предполагаем, что определены типы дан-

ных:

type lptr = ^item; { указатель на элемент списка }

item = record { элемент списка }

key : integer; { ключ }

inf : data; { данные }

next: lptr; { указатель на элемент списка }

end;

В обоих случаях сортировка ведется по возрастанию ключей. В

обоих случаях параметром функции сортировки является указатель на

начало неотсортированного списка, функция возвращает указатель на

начало отсортированного списка. Прежний, несортированный список

перестает существовать.

Пример 5.9 демонстрирует сортировку выборкой. Указатель newh

является указателем на начало выходного списка, исходно - пусто-

го. Во входном списке ищется максимальный элемент. Найденный эле-

мент исключается из входного списка и включается в начало выход-

ного списка. Работа алгоритма заканчивается, когда входной список

станет пустым. Обратим внимание читателя на несколько особеннос-

тей алгоритма. Во-первых, во входном списке ищется всякий раз не

минимальный, а максимальный элемент. Поскольку элемент включается

в начало выходного списка (а не в конец выходного множества, как

было в программном примере 3.7), элементы с большими ключами от-

тесняются к концу выходного списка и последний, таким образом,

оказывается отсортированным по возрастанию ключей. Во-вторых, при

поиске во входном списке сохраняется не только адрес найденного

элемента в списке, но и адрес предшествующего ему в списке эле-

мента - это впоследствии облегчает исключение элемента из списка

(вспомните пример 5.4). В-третьих, обратите внимание на то, что у

нас не возникает никаких проблем с пропуском во входном списке

тех элементов, которые уже выбраны - они просто исключены из

входной структуры данных.

{==== Программный пример 5.9 ====}

{ Сортировка выборкой на 1-связном списке }

Function Sort(head : lptr) : lptr;

var newh, max, prev, pmax, cur : lptr;

begin newh:=nil; { выходной список - пустой }

while head<>nil do { цикл, пока не опустеет входной список }

begin max:=head; prev:=head; { нач.максимум - 1-й эл-т }

cur:=head^.next; { поиск максимума во входном списке }

while cur<>nil do begin

if cur^.key>max^.key then begin

{ запоминается адрес максимума и адрес предыдущего эл-та }

max:=cur; pmax:=prev;

end; prev:=cur; cur:=cur^.next; { движение по списку }

end; { исключение максимума из входного списка }

if max=head then head:=head^.next

else pmax^.next:=max^.next;

{ вставка в начало выходного списка }

max^.next:=newh; newh:=max;

end; Sort:=newh;

end;

В программном примере 5.10 - иллюстрации сортировки вставка-

ми - из входного списка выбирается (и исключается) первый элемент

и вставляется в выходной список "на свое место" в соответствии со

значениями ключей. Сортировка включением на векторной структуре в

примере 3.11 требовала большого числа перемещений элементов в па-

мяти. Обратите внимание на то, что в двух последних примерах пе-

ресылок данных не происходит, все записи таблиц остаются на своих

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

{==== Программный пример 5.10 ====}

{ Сортировка вставками на 1-связном списке }

type data = integer;

Function Sort(head : lptr) : lptr;

var newh, cur, sel : lptr;

begin

newh:=nil; { выходной список - пустой }

while head<>nil do begin { цикл, пока не опустеет

входной список }

sel:=head; { эл-т, который переносится в выходной список }

head:=head^.next; { продвижение во входном списке }

if (newh=nil) or (sel^.key<newh^.key) then begin

{выходной список пустой или элемент меньше 1-го-вставка в начало}

sel^.next:=newh; newh:=sel; end

else begin { вставка в середину или в конец }

cur:=newh;

{ до конца выходного списка или пока ключ следующего

эл-та не будет больше вставляемого }

while (cur^.next<>nil) and (cur^.next^.key<sel^.key) do

cur:=cur^.next;

{ вставка в выходной список после эл-та cur }

sel^.next:=cur^.next; cur^.next:=sel;

end; end; Sort:=newh;

end;

– Конец работы –

Эта тема принадлежит разделу:

ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ. СВЯЗНЫЕ СПИСКИ

ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ СВЯЗНЫЕ СПИСКИ Связное представление данных в... Нелинейные разветвленные... Основные понятия...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Применение линейных списков

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Связное представление данных в памяти
Динамические структуры по определению характеризуются от- сутствием физической смежности элементов структуры в памяти не- постоянством и непредсказуемостью размера (числа элементо

Связные линейные списки
Списком называется упорядоченное множество, состоящее из пе- ременного числа элементов, к которым применимы операции включе- ния, исключения. Список, отражающий отношения соседств

Машинное представление связных линейных списков
На рис. 5.1 приведена структура односвязного списка. На нем поле INF - информационное поле, данные, NEXT - указатель на сле- дующий элемент списка. Каждый список должен иметь особ

Реализация операций над связными линейными списками
Ниже рассматриваются некоторые простые операции над линейны- ми списками. Выполнение операций иллюстрируется в общем случае рисунками со схемами изменения связей и программными пр

Мультисписки
В программных системах, обрабатывающих объекты сложной структуры, могут решаться разные подзадачи, каждая из которых требует, возможно, обработки не всего множества объектов, а ли

Представление списковых структур в памяти.
В соответствии со схематичным изображением разветвленных списков типичная структура элемента такого списка в памяти должна быть такой, как показано на рис.5.14. ┌&#

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги