Первым обновлением вашего алгоритма может быть сортировка списка, поэтому линейный поиск может быть быстрее (вы будете искать только до тех пор, пока не найдете один элемент больше своего), но это все еще наивное решение.
Лучшими подходами являются деревья бинарного поиска, а еще лучше - дерево префиксов (или три, уже упоминавшееся в другом ответе).
В «Языке программирования C» от K & R у вас есть точный пример того, чем вы являетесьнаходясь в поиске.Первый пример «структур данных с автореференцией» (6.5) представляет собой двоичное дерево поиска, используемое для подсчета вхождений каждого слова в строке.(Вам не нужно считать: P)
структура выглядит примерно так:
struct tnode {
char *word;
struct tnode *left;
struct tnode *right;
};
В книге вы можете увидеть весь пример того, что вы хотите сделать.
Деревья бинарного поиска хорошо работают с любым типом структуры данных, который может принять заказ, и будут лучше, чем линейный поиск в списке.
Извините за мой плохой английский, и поправьте меня, если я был не прав с чем-то, что я сказал, я очень noob с C: p
РЕДАКТИРОВАТЬ: Я могу 'Я не могу добавлять комментарии к другим ответам, но я прочитал комментарий от OP, говорящий: «Список не отсортирован, поэтому я не могу использовать бинарный поиск».Бессмысленно использовать бинарный поиск в связанном списке.Зачем?Бинарный поиск эффективен, когда доступ к случайному элементу быстрый, как в массиве.В двойном связанном списке ваш худший доступ будет n / 2. Однако вы можете поместить в список много указателей (доступ к ключевым элементам), но это плохое решение.