операция сдвига в связанном списке

#c

#c

Вопрос:

название
сыгранных игр
, оценка

Глубина
5
540 (head)

Питер
34
455

Avijit
2
430

Pekka
4
310 (хвост)

Для приведенного выше связанного списка списка игроков я хочу отсортировать список в порядке возрастания, когда Avijit получает более высокий балл, чем Peter. Итак, это операция сдвига в связанном списке. Кто-нибудь может помочь мне выяснить проблему в приведенном ниже коде для выполнения этой операции. И какое-либо решение? Спасибо.

 void Player::update_statistics(int last_game_point)
{
    player_ptr currPtr = head; // Moving pointer
    player_ptr prevPtr = NULL; // Pointer to node before *currPtr
    //player_ptr head;                //  class variable in Player class
    //player_ptr selected_player;     //  class variable in Player class
    //player_ptr previous_player;     //  class variable in Player class 

    // update selected player's data
    cout<<  (selected_player->played_games);  // increase by 1 for last game
    selected_player->total_point=(selected_player->total_point) last_game_point;

    if ((selected_player!=head) amp;amp; (previous_player->total_point < selected_player->total_point)){
        previous_player->link = selected_player->link;

        // search for appropriate position
        while (currPtr->total_point > selected_player->total_point){
            prevPtr = currPtr;
            currPtr = currPtr->link;
        }

        if (currPtr==head)
            selected_player->link=head;
            head=selected_player->link;
        }
        else {
            previous_player->link=selected_player;
            selected_player->link=currPtr;
        }
}
  

Комментарии:

1. Это домашнее задание? Если да, пожалуйста, отредактируйте свой вопрос, чтобы добавить тег homework .

2. нет, это не домашнее задание! я пытаюсь сам разработать игру.

Ответ №1:

Я думаю, вы хотите

 else {
        previous_player->link=selected_player;
        selected_player->link=currPtr;
    }
  

чтобы быть

 else {
        prevPtr->link=selected_player;
        selected_player->link=currPtr;
    }
  

Ответ №2:

Если это не домашнее задание, и вы не пытаетесь изучить встроенные алгоритмы в связанном списке, тогда вам следует

  1. используйте стандартную библиотеку
  2. избегайте использования указателей, когда они вам не нужны

Тем не менее, чтобы ответить на ваш вопрос:

 struct record {
    std::string name;
    int games_played;
    int score;
};

bool lower_score(const recordamp; a, const recordamp; b)
{
    return a.score < b.score;
}

// ...
std::vector<record> records = the_records();
std::sort(records.begin(), records.end(), lower_score);
  

Я не уверен, почему вы хотите использовать список; если у вас нет конкретной причины, то вам, вероятно, следует использовать вектор. В противном случае, std::list имеет sort() член:

 std::list<record> records = no_no_i_meant_those_records();
records.sort(lower_score);
  

Комментарии:

1. Спасибо за ваше предложение, но я хочу научиться использовать связанный список.