Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ(Суперфин).doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
404.99 Кб
Скачать

Работа со списковыми динамическими структурами

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

1. Создание пустого списка

Процесс формирования списка начинается с процедуры создания пустого списка. При этом указатель списка List устанавливается в Nil.

В программе создание пустого списка реализуется оператором List := Nil;

2. Включение элемента в начало списка

Процесс включения нового элемента EINew в список List может быть показан следующей схемой:

При добавлении нового элемента EINew в начало списка List происходит переключение связей между элементами, что на схеме помечено пунктиром. Теперь указатель списка List указывает на новый добавляемый элемент EINew, а поле ссылки указывает на тот элемент, который в исходном списке был первым. Связь указателя на список List с бывшим первым элементом разрывается (на схеме помечено крестиком (х). Фрагмент программы, реализующий вставку элемента EINew в начало списка List, имеет следующий вид:

New(EINew); {выделение памяти под новый элемент}

EINew^.Link := List; {новый элемент связывается с первым в списке}

List := EINew; {указатель списка ссылается на новый элемент}

Можно привести следующий пример создания списка из 10 элементов целого типа:

Var

Val: TDat; {определение типа элементов создаваемого списка}

begin

List := Nil;

for i := 1 to 10 do

begin

Read(Val); {ввод значения очередного элемента списка}

New(EINew); {выделение памяти под очередной элемент}

EINew^.Data := Val; {запись в информационное поле

создаваемого элемента введенного

значения}

EINew^.Link := List; {создаваемый элемент связывается

с первым в списке} List := EINew; {указатель списка ссылается

на создаваемый элемент}

end;

3. Перемещение по списку и поиск заданного элемента

При перемещении по списку или поиске в списке объекта с определенными свойствами перебирают последовательно все объекты начиная с первого объекта списка до последнего. Процесс перемещения по списку рассмотрим на примере поиска в списке объекта со значением Val. Если такой объект будет найден, возвращается указатель на данный объект, в противном случае возвращается значение Nil. Для перемещения по списку используется вспомогательная переменная Elem, искомый результат помещается в переменную FindElem.

Read(Val); {ввод искомого значения}

Elem := List; {текущий элемент становится первым элементом списка}

FindElem := Nil; {если по достижении конца списка элемент не будет найден, искомая переменная будет иметь значение Nil}

while Elem <> Nil do {пока не достигнут конец списка}

if Elem^.Data = Val {если искомый элемент найден}

then

begin

FindElem := Elem; {возвращаем значение найденного} Exit {элемента и прерываем выполнение цикла} end

else

Elem := Elem^.Link; {переход к следующему элементу списка}

4. Вставка элемента между соседними элементами списка

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

Р ассмотрим вставку элемента EINew после объекта ElOld, уже стоящего в списке.

New(EINew); {выведение памяти под новый элемент}

EINew^.Link:=EIOld^.Link; {новый элемент ссылается на тот, на который ранее ссылался EIOld}

EIOld^.Link:=EINew; {элемент EIOld ссылается на новый элемент}