在C中反转整数数组

时间:2017-12-11 01:01:03

标签: c arrays

给定一个包含5个元素[1,2,3,4,5]的整数数组,我试图颠倒数组中元素的顺序;例如数组将变为[5,4,3,2,1]。

int main(void) {
    int n = 5; //Num of elements
    int arr[5] = {1,2,3,4,5};
    for (int i = 0; i < n; i++) {
        printf("%d\n", arr[i]); //Print original vals
    }
    n--; //Decrement n by 1 for simplicity
    for (int i = n; i >= 0; i--) {
        int temp = arr[n - i]; //Set temp the max-index (4) - i
        printf("\nSmall: %d\nBig: %d\n", arr[n - i], arr[i]); //Print current temp & arr[i]
        arr[n - i] = arr[i]; //Set arr[max-index - i] to arr[i] (e.g arr[0] = arr[4]) 
        arr[i] = temp; //Set arr[i] to arr[max-index - 1] (e.g. arr[4] = arr[0])
        printf("\nBig: %d\nSmall: %d\n", arr[n - i], arr[i]); //Print new set
    }
    for (int i = 0; i < n + 1; i++) { //Print array in reverse order
        printf("%d\n", arr[i]);
    }
    return 0;

}

第一个for循环应打印:1 2 3 4 5 最后:5 4 3 2 1

然而,它两次打印1 2 3 4 5,但是反转数组的循环中的print语句打印正确的数字。 我做错了什么吗?

我是否应该动态分配内存或其他不允许我更改数组的内容?

3 个答案:

答案 0 :(得分:5)

问题是,你将每个元素交换两次(除非它是中心元素),最终不会交换任何东西。在第一个循环中,您在技术上交换第一个和最后一个项目。在最后一个循环中,你做了同样的事情。因此,您将物品退回原始位置。

另一个问题是你试图访问未定义的arr [5],因为你的数组大小为5,因此索引应该只有0到4。

以下是一个反转数组的函数

void ReverseArray(int arr[], int size)
{
    for (int i = 0; i < size/2; ++i)
    {
        int temp = arr[i];
        arr[i] = arr[size - 1 - i];
        arr[size - 1 - i] = temp;
    }
}

答案 1 :(得分:0)

要反转数组,您必须执行以下操作:

for(int i = i; i<n/2; ++i)
{
    int temp = arr[i];
    arr[i] = arr[n-i-1];
    arr[n-i-1] = temp;        
}

答案 2 :(得分:0)

您正在反转阵列两次。 在每次迭代中,您将两个数字交换到距离中心相同的距离。

因此,在迭代的前半部分,您已经颠倒了数组。当你继续迭代时,你再次交换并且数组保持不变。

要解决此问题,只需将反转循环更改为(对i> = n / 2更改i&gt; = n)

  for (int i = n; i >= n/2; i--) {...swaping operations...}