在2.10中的inplace_swap函數的基礎上,你決定寫一段代碼,實現將一個數組中的元素兩端依次對調,你寫出下面這個函數:
1 void reverse_array(int a[], int cnt) 2 { 3 int first, last; 4 for(first = 0, last = cnt - 1; 5 first <= last; 6 first ++, last --) 7 { 8 inplace_swap(&a[first], &a[last]); 9 } 10 }
當對一個數組包含1、2、3、4時,得到預期的結果4、3、2、1。不過,當一個包含元素為1、2、3、4、5的數組使用這個函數時,你會很驚奇看到結果為5、4、0、2、1。對於偶數個元素的數組正常工作,奇數個元素的數組會把中間元素設置為0。
A.對於一個長度為奇數的數組,長度為cnt = 2k + 1,函數reverse_array最後一次循環中,變量first和last的值分別是什麼?
B.為什麼這時調用函數inplace_swap會將數組元素設置為0?
C.對reverse_array的代碼做哪些簡單改動就能消除這個問題?
解答:
A. first和last都為k。
B. 最後一次循環時。假設a[k]為p。
步驟 *x *y 初始 a[k]=p a[k]=p 第一步 0 p^p=0 第二步 0 0 第三步 0 0C. 將第5行代碼改為如下即可。
1 first < last