2013-04-03 4 views
0

Читаю «Алгоритм Design Manual», и это говорит о том, что три операции на базовом списке являются поиска, вставки и удаления. Затем он продолжает описывать алгоритм в C, который, как только он найдет узел, который он ищет (путем сравнения данных узлов с тем, что искали), возвращает этот узел (и, следовательно, любые узлы, связанные под ним). Если он не находит то, что он ищет, он возвращает NULL.Зачем искать связанный список?

Итак, мой вопрос: знаем ли мы, что мы ищем, зачем мы его ищем? И если причина состоит в том, чтобы увидеть, включена ли она в список, то почему не логическая функция «содержит» то, что мы действительно хотим?

+1

Я предполагаю, что поиск включает использование произвольного поискового предиката. т.е. найти первое значение в списке, который удовлетворяет определенным критериям. Равенство есть только один возможный предикат. – Pubby

+2

Как работает функция 'contains', если не путем поиска в списке? – arootbeer

+0

@arootbeer было бы абсолютно необходимо искать список, однако его намерение отличается. «Поиск» возвращает нужный нам узел или «null», тогда как 'contains' будет просто сказать, соответствуют ли данные в списке. – mjgpy3

ответ

2

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

0

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

0

Булевая функция «содержит» может быть всем, что мы хотим. Что делать, если мы хотим найти набор данных, которого у нас нет, но у нас есть идентификационный номер?

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

1

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

0

Рассмотрим простой пример ...

Вы пишете программу, которая просит людей для их возраста (в годах) и сохраняет их в списке, а затем показывает гистограмму (сколько людей там был любого возраста), или, может быть, это показывает, сколько людей исполнилось 21 в прошлом году.

В такой программе вы можете не знать заранее, что будет в списке. И именно поэтому вы его ищите.

0

Единственный элемент в структуре связанного списка - это узел head. Чтобы перейти к определенному узлу в списке, вам нужно пройти через узел head к следующему узлу, следующему узлу ... и, наконец, к целевому узлу, следовательно, к поиску. Таким образом, contains будет делать то же самое - найдите узел, который equals, к узлу, который вы ищете.