我检查了一些在C中反转数组的视频,因此我知道我的逻辑是正确的。这是我的代码:
#include <stdio.h>
void reverse( int arr[], unsigned int len )
{
int i=0;
int n=len;
int j=len-1;
int temp;
while (i<n)
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i++;
j--;
}
}
void reverse( int arr[], unsigned int len );
int main( void )
{
int a[] = {11, 19, 13};
unsigned int len = 3;
reverse( a, len );
int k=0;
for( k=0; k<len; k++ )
{
printf( "%d ", a[k] );
}
printf( "\n" );
return 0;
}
它输出相同的数组。我找不到问题所在。我应该为reverse
函数返回一些内容吗?
答案 0 :(得分:7)
你正在反转阵列两次;这就是你拥有原始阵列的原因。
如何?举一个10元素数组的例子。作为第一步,您将交换第0和第9个元素。作为你的最后一步,你将交换第9和第0个元素。最终结果:没有变化。
您不希望i
运行n
。您希望i
最多运行j
,以便您永远不会交换元素(即将条件更改为while (i < j) { ... }
)
答案 1 :(得分:0)
你正在颠倒你的阵列两次,所以一旦你扭转了它,你再扭转它,使它变成与原始相同。
停止倒车不要运行循环直到n
,而是将其运行到j
。
答案 2 :(得分:0)
。除此之外,为了良好的编程习惯,尝试手动避免参数。例如。在您的代码中,您使用了len,i,j,n在您身边。
#include <stdio.h>
void reverse( int arr[],int i,int j );
void reverse( int arr[], int i,int j )
{
int temp;
while (i<j)
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i++;
j--;
}
}
int main()
{
int arr[] = {11, 19, 13};
int len=sizeof(arr)/sizeof(arr[0]);
int i=0;
int j=len-1;
reverse( arr,i,j);
for (int k=0; k <len; k++)
printf("%d ", arr[k]);
return 0;
}