Сохранить адрес узла списка ссылок

0

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. Просто нужен способ хранения адреса.

Теги:
doubly-linked-list

2 ответа

0

Если вы использовали std::list вы можете использовать std::sort с различными функциями сравнения и не изменять структуру узла для каждой последовательности упорядочения.

Другая идея - разместить ваши объекты в std::vector и создать std::list<item *> для каждого элемента. Это позволит вам получить доступ к элементам в векторе в разных порядках. Например, один список может быть для восхождения по названию. Другим может быть снижение по релевантности.

0

Насколько я понимаю, вам нужно только сохранить указатель на самый большой элемент, так что ничего фантастического, просто еще один 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;
  • 0
    В этом коде предполагается, что самый большой элемент в списке больше (-1.0) . В вопросе ОП нет ничего, что указывало бы на это в качестве гарантии или требования. Лучше всего полностью исключить самый largest временный объект и просто использовать два указателя, один из которых является «ходящим», а другой поддерживает указатель на текущего «победителя», который инициализируется для заголовка списка при запуске.
  • 0
    @WhozCraig звучит как еще лучшее решение. Я буду изменять код в соответствии с вашим предложением

Ещё вопросы

Сообщество Overcoder
Наверх
Меню