Сортировка выбора Проблемы с сохранением указателей в правильных местах после сортировки
Я пытаюсь выполнить сортировку выбора, где я сортирую по большинству забитых голов. У меня есть 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 для справки)
С другой стороны, если это вообще возможно, я бы рекомендовал вам использовать только строки. Кроме того, вы можете подумать о том, чтобы ваши данные были более тесно связаны, то есть иметь список структур игрока, который содержит {имя, цели и помощь игрока), и просто реорганизовать ваш список, но я думаю, что это дизайнерское решение, которое вам решать.