2013-02-20 43 views
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 

回答

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; 
      } 
    } 

} 
0

看看相关的角色复制代码,您有:

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

你的“名字”变量是char** (我假定它被实例化为char*,然后你将它作为指针传递),所以当你执行*names[lh]时,你首先将你的char**获得索引lh处的char*,然后对其进行解引用。这与索引lh中的char*的第0个元素的索引相同,它给出了它的第一个字符。既然你为所有与名字相关的操作都这样做了,你只会绕着名字的第一个字符移动。另外,你的tempN变量被声明为int,这可能不是你想要的。

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

请注意,如果可能的话,我会主张使用字符串。另外,你可能想考虑让你的数据更紧密地耦合,即有一个包含玩家{名字,目标和助攻}的玩家结构列表,并且只是重新安排你的列表,但我想这是一个设计决定,由你决定。