2011-10-17 53 views
0

我正在使用選擇排序從板球團隊中排序名稱列表。選擇排序邏輯錯誤

該排序在第一次重複名稱3次後消除了我排序的數組中的兩個其他名稱。

輸入從陣列(按順序):

克拉克沃森啤酒科普蘭Haddin哈里斯休斯赫西約翰遜卡瓦賈里昂沼澤帕丁森龐廷Siddle華納

排序陣列後

輸出:

啤酒啤酒啤酒科普蘭Haddin哈里斯休斯赫西·約翰遜卡瓦賈里昂沼澤帕丁森龐廷

代碼:

void sort_names (Team_t player[]) { 

int pos; 
int min; 
int i, str_check; 

char *temp = NULL; 

for (pos = 0; pos < MAX_PLYR; pos++) { 

    min = pos; 

    for (i = (pos + 1); i < MAX_PLYR; i++) { 

     str_check = strcmp(player[i].pname, player[min].pname); 

     if (str_check < 0) { 

      min = i; 

    } 

    } 

    if (min != pos) { 

     temp = player[pos].pname; 

     strcpy(player[pos].pname, player[min].pname); 

     strcpy(player[min].pname, temp); 

    } 

}  
} 
+0

您是否嘗試用調試器(甚至是筆和紙)逐步執行代碼以查看發生了什麼? – Vicky

+0

我可能錯過了一些東西,我已經桌子檢查過幾次,並且把它從地獄中解救出來。 –

+1

得到'啤酒'後你的代碼就醉了: -/ – DhruvPathak

回答

2

你的代碼,該位將無法正常交換條目:

temp = player[pos].pname; 
strcpy(player[pos].pname, player[min].pname); 
strcpy(player[min].pname, temp); 

第一行節省了指針到「POS」球員的名字temp - 名稱本身。然後第一個strcpy覆蓋它 - 它丟失了。 (第二個strcpy只是將相同的字符串複製回原來的位置。)這就是爲什麼您會看到不止一次首先排序的項目。

+0

沒錯。對字符串進行排序可能更好也更安全,但指向它們的指針是'player []'內的'pname'值。 –

+0

感謝馬丁!解決了它。我明白我現在做錯了什麼 –