Алгоритмизации
Скачать 1.15 Mb.
|
АлгоритмудаленияэлементавспискепоключуУдалить из списка элемент, информационная часть (ключ) которого совпадает со значением, введенным с клавиатуры. Решение данной задачи проводим в два этапа – поиск и удаление. Изменим алгоритм поиска, т.к. в дальнейшем понадобится дополнительный указатель для удаления и добавим контроль на случай отсутствия в списке искомого элемента. Первыйэтап– поискВведем дополнительный указатель и присвоим ему значение NULL: Spis *key = NULL; Введем с клавиатуры искомое значение i_p(ключ поиска). Установим текущий указатель на начало списка: t = begin; Начало цикла (выполнять пока t != NULL). Сравниваем информационную часть текущего элемента с искомым. Если они совпадают (t -> info = i_p), то (выводим на экран сообщение об успехе); а) запоминаем адрес найденного элемента: key = t; б) завершаем поиск – досрочный выход из цикла (break); Иначе, переставляем текущий указатель на следующий элемент: t = t -> Next; Конец цикла. Контроль, если key = NULL , т.е. искомый элемент не найден, то сообщаем о неудаче и этап удаления не выполняем (return или exit) . Второйэтап– удалениеЕсли найден элемент для удаления, т.е. key != NULL, то удаляем элемент из списка в зависимости от его местонахождения. Если удаляемый элемент находится в начале списка, т.е. key = begin, то создаем новый начальный элемент: а) указатель начала списка переставляем на следующий (второй) элемент: begin = begin -> Next; б) указателю Prevэлемента, который был вторым, а теперь стал первым присваиваем значение NULL, т.е. предыдущего нет: begin -> Prev = NULL; Если удаляемый элемент в конце списка, т.е. keyравен end, то: а) указатель конца списка переставляем на предыдущий элемент, адрес которого в поле Prev последнего (end): end = end -> Prev; б) обнуляем указатель на следующий (Next) элемент нового последнего элемента end -> Next = NULL; Если удаляемый элемент находится в середине списка, нужно обеспечить связь предыдущего и последующего элементов: Адреса элементов: . . . . . . Порядковые номера: k-1 kk+1 а) от k-го элемента с адресом keyобратимся к предыдущему (k–1)-му элементу, адрес которогоkey->Prev, и в его полеNext[(key->Prev)->Next] запишем адрес (k+1)-го элемента, значение которогоkey->Next: ( key -> Prev ) -> Next = key -> Next; б) аналогично в поле Prev(k+1)-го элемента с адресом key->Next запишем адрес (k-1)-го элемента: ( key -> Next ) -> Prev = key -> Prev; Освобождаем память, занятую удаленным элементом free(key); |