Im в настоящее время записывает нисходящую функцию сортировки для двойного списка ссылок. У меня есть флаг для наибольшего значения, но интересно, есть ли способ сохранить адрес указателя узла, чтобы я мог установить его флаг за пределы цикла, когда выполняются операции.
Спасибо. В этом случае наши данные актуальны.
float findLargest(DoublyLinkList largestdata)
{
ListPlayHolder *findbiggest = largestdata.lhead;
float largest = findbiggest ->relevance;
while (findbiggest ->next != NULL)
{
if (findbiggest ->relevance > largest && findbiggest ->largestFlag != true)
{
largest = findbiggest ->relevance;
}
findbiggest = findbiggest->next;
}
return largest;
}
Это не причудливый вид, просто пытающийся сделать упрощенную нисходящую сортировку моих данных. Как только я нахожу самый большой, я хочу установить флаг своих узлов в true. Просто нужен способ хранения адреса.
Если вы использовали std::list
вы можете использовать std::sort
с различными функциями сравнения и не изменять структуру узла для каждой последовательности упорядочения.
Другая идея - разместить ваши объекты в std::vector
и создать std::list<item *>
для каждого элемента. Это позволит вам получить доступ к элементам в векторе в разных порядках. Например, один список может быть для восхождения по названию. Другим может быть снижение по релевантности.
Насколько я понимаю, вам нужно только сохранить указатель на самый большой элемент, так что ничего фантастического, просто еще один ListPlayHolder*
(который, похоже, тип данных указателя на узел - довольно запутанное имя, если вы спросите меня, но что угодно).
Кроме того, я бы порекомендовал не инициализировать largest
с чем-то, на что указывает findbiggest
- не видел другого кода вашего списка, но я предполагаю, что указатель может быть NULL
если список пуст.
Фактически вам не нужно сохранять значение релевантности отдельно, если вместо этого удерживать указатель на текущий самый большой объект (спасибо @WhozCraig). Здесь измененный код:
ListPlayHolder* findbiggest = largestdata.lhead;
ListPlayHolder* largest = findbiggest;
while (findbiggest && findbiggest ->next != NULL)
{
if (findbiggest ->relevance > largest->relevance && findbiggest->largestFlag != true)
{
largest = findbiggest;
}
findbiggest = findbiggest->next;
}
// here do whatever modifications you need to do to flags? or maybe return largestPtr?
largest->largestFlag = true;
return largest->relevance;
(-1.0)
. В вопросе ОП нет ничего, что указывало бы на это в качестве гарантии или требования. Лучше всего полностью исключить самыйlargest
временный объект и просто использовать два указателя, один из которых является «ходящим», а другой поддерживает указатель на текущего «победителя», который инициализируется для заголовка списка при запуске.