2013-02-20 52 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以供參考)

請注意,如果可能的話,我會主張使用字符串。另外,你可能想考慮讓你的數據更緊密地耦合,即有一個包含玩家{名字,目標和助攻}的玩家結構列表,並且只是重新安排你的列表,但我想這是一個設計決定,由你決定。