Сортировка выбора Проблемы с сохранением указателей в правильных местах после сортировки

Я пытаюсь выполнить сортировку выбора, где я сортирую по большинству забитых голов. У меня есть 3 категории; цели, голевые передачи, имена. Я могу правильно сортировать по целям и сохранять цели игроков и помогает в правильных местах после сортировки, но когда я пытаюсь переместить имена в правильное место после сортировки, он перемещает только первую букву имени. Вот мой код Спасибо за помощь!

void sortPlayersByGoals(int* goals, int* assists, char** names, int size)
{
    int lh, rh, i, tempG, tempA, tempN;
    for(lh = 0; lh < size; lh++)
    {
            rh = lh;
            for(i = lh; i < size; i++)
            {
                    if(goals[i] > goals[rh])
                    {
                            rh = i;
                    }
            tempG = goals[lh];
            tempA = assists[lh];
            tempN = *names[lh];
            goals[lh] = goals[rh];
            *names[lh] = *names[rh];
            assists[lh] = assists[rh];
            goals[rh] = tempG;
            *names[rh] = tempN;
            assists[rh] = tempA;
            }
    }

}

Вот мой вывод, если это поможет показать мою проблему..

Pre-Sort
Name                       Goals                   Assists
Redden                         2                         0
Berglund                       5                         2
Jackman                        2                         0
Stewart                        4                         0
Oshie                          3                         5
McDonald                       2                         4
Pietrangelo                    2                         7
Perron                         2                         6
Tarasenko                      5                         5
Post-Sort
Name                       Goals                   Assists
Tedden                         5                         5
Berglund                       5                         2
Sackman                        4                         0
Otewart                        3                         5
Rshie                          2                         0
McDonald                       2                         4
Pietrangelo                    2                         7
Perron                         2                         6
Jarasenko                      2                         0

2 ответа

Решение
void sortPlayersByGoals(int* goals, int* assists, char** names, int size)
{               /*  names is an array of pointers to char   */
    int lh, rh, i, tempG, tempA;
    char *tempN;     /* a pointer to one name */
    for(lh = 0; lh < size; lh++)
    {
            rh = lh;
            for(i = lh; i < size; i++)
            {
                    if(goals[i] > goals[rh])
                    {
                            rh = i;
                    }
            tempG = goals[lh];
            tempA = assists[lh];
            tempN = names[lh]; /* names[lh] is a pointer to the name in pos lh */
            goals[lh] = goals[rh];
            names[lh] = names[rh]; /* swap the pointers */
            assists[lh] = assists[rh];
            goals[rh] = tempG;
            names[rh] = tempN;  /* and not just the first letter */
            assists[rh] = tempA;
            }
    }

}

Посмотрите на соответствующий код для копирования символов:

int tempN;
...
tempN = *names[lh];
*names[lh] = *names[rh];
*names[rh] = tempN;

Ваша переменная "names" является char** (Я предполагаю, что он создан как массив char* который вы затем передаете в качестве указателя), поэтому, когда вы выполняете *names[lh]вы в первый раз индексируете char** чтобы получить char* по указателю lhзатем разыменовываем его. Это то же самое, что индексирование в 0-й элемент char* с индексом lh, который дает вам 1-й символ. Поскольку вы делаете это для всех ваших операций, связанных с именами, вы просто перемещаетесь вокруг 1-го символа своих имен. Кроме того, ваш tempN переменная объявлена ​​как int, что, вероятно, не то, что вы хотели.

Вы можете исправить это (с минимальными изменениями в вашем коде), зацикливая длину имени, которое вы хотите скопировать, и назначая его символ за символом (вместо только 1-го символа, как вы делаете сейчас). Или вы можете использовать strcpy (или один из его вариантов, см. http://msdn.microsoft.com/en-us/library/kk6xf663%28v=vs.110%29.aspx для справки)

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

Другие вопросы по тегам