0

我正在尝试执行选择排序,我按得分最多的目标排序。我有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
4

2 回答 2

0

查看您拥有的相关字符复制代码:

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

您的“名称”变量是一个char**(我假设它被实例化为一个数组,char*然后您将其作为指针传递),因此当您执行时*names[lh],您首先索引到您char**以获取char*at index lh,然后取消引用它。这与索引到char*索引 lh 的第 0 个元素相同,它为您提供了第一个字符。由于您对所有与名称相关的操作都执行此操作,因此您只会在名称的第一个字符周围移动。此外,您的tempN变量被声明为 int,这可能不是您想要的。

您可以通过遍历要复制的名称的长度并逐个字符地分配它(而不是像现在这样只使用第一个字符)来修复它(对您的代码进行最小的修改)。或者您可以使用 strcpy (或其变体之一,请参阅http://msdn.microsoft.com/en-us/library/kk6xf663%28v=vs.110%29.aspx以供参考)

附带说明一下,如果可能的话,我会提倡您只使用字符串。此外,您可能想要考虑让您的数据更紧密地耦合,即拥有一个包含玩家{名称、目标和助攻}的玩家结构列表,然后重新排列您的列表,但我想这是一个设计决策由你决定。

于 2013-02-21T00:49:08.443 回答
0
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;
            }
    }

}
于 2013-02-21T00:54:01.740 回答