
- •Динамические структуры данных
- •1. Ссылочный тип данных
- •2. Операции над указателями
- •1. Содержать адрес какой-либо переменной, называемой динамической или указанной переменной, память под которую уже выделена.
- •О бъявление ссылочной переменной
- •11.3. Динамические переменные
- •Работа со списковыми динамическими структурами
- •1. Создание пустого списка
- •2. Включение элемента в начало списка
- •3. Перемещение по списку и поиск заданного элемента
- •4. Вставка элемента между соседними элементами списка
- •5. Вставка элемента в конец списка
- •6. Удаление первого элемента списка
- •7. Удаление объекта, стоящего между соседними элементами списка
- •.8. Удаление последнего элемента списка
- •9. Удаление всех элементов списка
- •10. Вывод на печать всех элементов списка
- •Пример составления программы
5. Вставка элемента в конец списка
При выполнении данной операции в поле указателя последнего элемента исходного списка List помещается ссылка на новый вставляемый элемент EINew, а в поле ссылки вставляемого элемента помещается адрес Nil.
Фрагмент программы, реализующей данную операцию, имеет следующий вид:
New(EINew); {выделение памяти под новый элемент} ElEnd^Link := EINew; {последний элемент ссылается на новый элемент}
EINew ^. Link := Nil; {в поле ссылки вставляемого элемента
помещается адрес Nil}
6. Удаление первого элемента списка
При удалении первого элемента списка указатель списка List перемещается на динамический объект, на который ранее ссылался первый элемент исходного списка.
ElFirst := List; {устанавливаем указатель на первый элемент
в начало списка}
List := List^.Link;{yKa3aTenb списка ссылается на следующий элемент}
Dispose(EIFirst); {удаление первого элемента и освобождение области памяти}
7. Удаление объекта, стоящего между соседними элементами списка
При удалении элемента, занимающего промежуточную позицию в списке, происходит переключение связей таким образом, что поле ссылки элемента, стоящего перед удаляемым динамическим объектом, указывает на элемент, стоящий за удаляемым объектом.
EICut := List; {устанавливаем указатель на удаляемый элементв начало списка}
while EICut^.Link<>Nil do
begin
if EICut^.Data = Priznak
then
begin
EIPred^.Link := EICut^.Link;
Disopose(EICut);
EICut := EIPred^.Link
End
else
begin
ElPred := EICut;
EICut := EICut^.Link
end
end
.8. Удаление последнего элемента списка
П
ри
удалении последнего элемента списка в
поле ссылки предыдущего элемента
заносится значение Nil,
связь между последним и предпоследним
элементами списка разрывается.
EIEnd := List; {устанавливаем указатель последнего элемента списка}
while EIEnd^.Link <> Nil do {пока не достигнут конец списка}
begin
ElPred := ElEnd; {перемещение предыдущего элемента
на следующую позицию}
ElEnd := ElEnd^.Link; {перемещение удаляемого элемента
на следующую позицию}
end;
ElPred^. Link := Nil; {установка предыдущего элемента последним} Dispose(EIEnd); {удаление последнего элемента}
9. Удаление всех элементов списка
При удалении списка производятся последовательное перемещение указателя начала списка на следующий элемент и удаление освободившегося элемента:
Elem := List;
while Elem <> Nil do {пока не достигнут конец списка}
begin
List := List^.Link; {перемещение начала списка на следующую
позицию}
Dispose(Elem); {удаление предыдущего элемента}
Elem := List
end;
10. Вывод на печать всех элементов списка
Содержимое списка на печать выводится посредством последовательного перемещения указателя от одного элемента к последующему и распечаткой содержимого текущего элемента:
Elem := List; {установка текущего элемента на начало списка} while Elem <> Nil do {пока не достигнут конец списка} begin
Write(Elem^.Data); {вывод текущего элемента на печать} Elem := Elem^.Link; {перемещение элемента на следующую
позицию} end;