如何用c语言用指针倒置一维数组实现倒置数组13245?

本节介绍将数组倒置的实现方法。所谓倒置就是将数组元素中的数据倒过来。
# include <stdio.h>
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int b[5];
//用来存放倒置后的数据
int i, j;
for (i=0, j=4; i<5, j>=0; ++i, --j)
{
b[i] = a[j];
printf("%d\n", b[i]);
}
return 0;
}
输出结果是:54321此程序中,for 循环括号中的写法是正确的。前面讲过,for 循环的格式为:
for (表达式1;表达式2;表达式3)
这只是一般的形式。以表达式 1 为例,它是一个“整体”,它可以是一个表达式,也可以是多个表达式,如果是多个表达式就用逗号隔开,如程序中那样。但是如果表达式间用分号隔开就不能看成一个“整体”,即只能看成一个表达式了,如上面的“表达式 1;表达式 2;表达式 3”。但是上面这个程序还不能称得上完美。程序中,完成相同功能执行的步数越少,算法就越好,效率也就越高。上面这个算法是完全的“复制”,数组有几个元素就执行多少次。其实有更好的算法,只需要上面算法执行步数的一半就能完成任务,即互换思想。要完成倒置的功能,只需要第一个元素和最后一个元素交换、第二个元素和倒数第二个元素交换、第三个元素和倒数第三个元素交换……不管数组元素的个数是奇数还是偶数,这个算法都是成立的。如果是偶数那么每个元素都有机会交换;如果是奇数,那么最中间的那个元素就不交换。下面将数组加长,再将这种算法的程序给大家写一下:
# include <stdio.h>
int main(void)
{
int a[23] = {1,5,66,8,55,9,1,32,5,65,4,8,5,15,64,156,1564,15,1,8,9,7,215};
int i = 0;
//循环变量1, i的值为数组第一个元素的下标
int j = 22;
//循环变量2, j的值为数组最后一个元素的下标
int buf;
//互换时的中间存储变量
for (; i<j; ++i, --j)
/*因为i和j已经初始化过了, 所以表达式1可以省略, 但表达式1后面的分号不能省。*/
{
buf = a[i];
a[i] = a[j];
a[j] = buf;
}
for (i=0; i<23; ++i)
{
printf("%d\x20", a[i]);
//\x20表示空格
}
printf("\n");
return 0;
}
输出结果是:215 7 9 8 1 15 1564 156 64 15 5 8 4 65 5 32 1 9 55 8 66 5 1
逆序排列题目描述输入一个整数,从高位开始逐位分割并输出各位数字。输入输入一个正整数n,n是int型数据输出依次输出各位上的数字,每一个数字后面有一个空格,输出占一行。例如,输入 12345 ,输出 1 2 3 4 5样例输入12345样例输出1 2 3 4 5#include<stdio.h>
int main()
{
long int n,x[1000],i=0,a=0;
scanf("%ld",&n);
do
{
x[i]=n%10;/*分割个位,将每次的个位按顺序储存在数组中*/
n=n/10;/*排除个位*/
a++;/*记录数组个数,由于数组从0开始,所以最后注意减一*/
i++;
}while(n>0);
for(i=a-1;i>=0;i--)/*循环逆序输出储存在数组中的值,起始位置是a-1*/
{
printf("%ld ",x[i]);
}
printf("\n");
return 0;
}
//方法一:使用中间变量交换
#include <stdio.h>
void reverse_array1(int arr[],int length)
{
for (int i = 0; i < length / 2; i++) {
int temp = arr[i];
arr[i] = arr[length - 1 - i];
arr[length - 1 - i] = temp;
}
}
//方法二: 使用指针进行交换
void reverse_array2(int arr[], int length) {
int *p = arr, *q = arr + length - 1;
while (p < q) {
int temp = *p;
*p = *q;
*q = temp;
p++;
q--;
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int length = sizeof(arr) / sizeof(arr[0]);
reverse_array1(arr, length);
//reverse_array2(arr,length);
for (int i = 0; i < length; i++) {
printf("%d ", arr[i]);
}
return 0;
}
总结下来就是二种方法: 设立中间量进行交换,这种方法需要使用一个中间变量,逐个交换数组的前半部分和后半部分,直到交换完整个数组。
指针进行交换。这种方法只需要两个指针,一个指向数组的第一个元素,一个指向数组的最后一个元素,然后逐个交换它们指向的元素,直到交换完整个数组。

我要回帖

更多关于 c语言用指针倒置一维数组 的文章

 

随机推荐