Род Стивенс

Книги → Delphi. Готовые алгоритмы → Глава 2. Списки

Удалить элемент из начала связанного списка так же просто, как и доба­вить его. Просто установите указатель top_cell на следующую ячейку спис­ка (см. рис. 2.5). Исходный текст для этой операции еще проще, чем код для до­бавления элемента:

top cell := top_cellA.NextCell;

Когда указатель top_cel 1 перемещается на второй элемент списка, в програм­ме больше не остается переменных, ссылающихся на первый объект. В этом случае память для этого объекта останется выделенной, но доступа к нему не будет. Чтобы избежать этого, программе требуется сохранить указатель на объект во временной переменной. После сброса переменной top_cell программа должна использовать директиву Dispose, чтобы освободить память, выделенную для данного объекта.

target := top_cell;

top_c611 := top_tcell/'. NextCell;

Dispose(target);

Удалить элемент из середины списка так же просто. Предположим, вы хотите удалить элемент после ячейки after_me. Просто установите значение NextCel 1 данной ячейки так, чтобы оно указывало на следующую ячейку. Для освобожде­ния памяти под удаленную ячейку необходима временная переменная. На рис. 2.6 показана эта операция. Код Delphi имеет следующий вид:

target := after^ne".NextCell; after_me/'.NextCell := target*.NextCell;

Dispose(target) ;

Снова сравните этот код с тем, который понадобился Для выполнения такой же операции в списке на базе массива. Можно пометить удаленный элемент как неиспользуемый, но подобные записи все равно останутся в списке. Процедуры, работающие с этим списком, должны быть более сложными, чтобы учитывать эту 1 особенность. Кроме того, работа может происходить очень медленно из-за пере­полнения «мусором» и, в конце концов, нужно будет провести чистку памяти.

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

Метки

Содержание процедур добавления и удаления элементов из списка зависит от того, где нужно добавить или удалить элемент - в начале или середине списка. Можно свести оба этих случая к одному и избавится от избыточного кода, если ввести специальную сигнальную метку (sentinel) в самом начале списка. Ячейку метки нельзя удалять. Она не содержит никаких значимых данных и использует­ся только для того, чтобы помечать вершину списка.

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

← предыдущая следующая →

Страницы раздела: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Публикация компанией Dropbox кода Zulip – средства общения для IT-разработчиков

20.11.2015
Одной из одобрительно встреченных программистами инициатив, реализующихся в рамках акции Hack Week, стала публикация исходного кода приложения Zulip – веб-приложения для общения между собой разработчиков в сфере IT-технологий.

Объединение ОС Android и Chrome

17.11.2015
Слухи об объединении двух крупнейших ОС компании Google, Android и Chrome, гуляют по Интернету уже более 5 лет, но до сих пор этого не случилось, хотя очевидно, что с течением времени эти ОС становятся всё более похожими: так, в последнее время появилось немало Android-устройств, к которым прилагаются клавиатуры, а Chrome OS «научилась» работать с сенсорными экранами.

Конференция Linux Piter 2015

15.11.2015
Уже почти через неделю в Санкт-Петербурге впервые в истории пройдёт конференция, посвящённая проблемам свободного программного обеспечения – Linux Piter 2015.