一.什么是数组的逆置呢?

int a[10]={1,2,3,4,5,6,7,8,9,10};

将数组变为 a[10]={10,9,8,7,6,5,4,3,2,1};

这就叫做数组的逆置。

二.

1.循环实现数组的逆置

这个是我们在初学C语言时最容易的实现方法!

a.通过for循环实现
//通过循环完成对数组的逆置 #include<stdio.h> #define size 10 void Inversion(int[], int);
int main(void) { int a[size] = { 0 }; int i = 0; for (i = 0; i < 10; i++)
//完成对数组的初始化 { scanf("%d",&a[i]); } printf("该数组在逆置前为:"); for (i = 0; i < 10;
i++) { printf("%d ", a[i]); } int sz = sizeof(a) / sizeof(a[0]);
Inversion(a,sz); printf("\n该数组在逆置后为:"); for (i = 0; i < 10; i++) { printf("%d
", a[i]); } return 0; } void Inversion(int a[],int sz) { int temp = 0; int i =
0; if (sz % 2 == 0) { for (i = 0; i < sz / 2; i++) { temp = a[i]; a[i] = a[sz -
1 - i]; a[sz - 1 - i] = temp; } } else { for (i = 0; i < (sz + 1) / 2; i++) {
temp = a[i]; a[i] = a[sz - 1 - i]; a[sz - 1 - i] = temp; } } }
       
在这个段代码里面要注意的就是,需要逆置的数组的大小是奇数还是偶数!在本代码段里数组的类型是int类型,所以数组接收int类型的数值,如果要逆置字符数组,只需改变数组的类型即可!
但是同时还要注意,数组是字符数组还是,字符串数组,字符数组不是一’\0‘结尾的,而字符串数组是以’\0‘结尾的!

b.通过while循环实现数组的逆置
void Inversion1(int a[], int sz) { int temp = 0; int* left = a; int* right = a
+ sz - 1; while (left < right) { temp = *left; *left = *right; *right = temp;
left++; right--; } }
这里在while循环中是通过指针来实现对象之间的交换的,此时就不需要在考虑数组大小奇偶的问题了。

c.递归实现数组逆置

编写一个函数 reverse_string(char * string)(递归实现)

实现:将参数字符串中的字符反向排列,不是逆序打印。

要求:不能使用C函数库中的字符串操作函数。

比如:
char arr[] = "abcdef";

逆序之后数组的内容变成:fedcba
#include<stdio.h> #define size 100 int new_strlen(char String1[]); void
Inversion(char String1[]); int main(void) { char String1[size] = { 0 };
scanf("%s",String1); printf("将该数组逆置前为:%s\n",String1); Inversion(String1);
printf("将该数组逆置后为:%s\n",String1); return 0; } void Inversion(char String1[]) {
int temp = 0; int sz = new_strlen(String1); temp = *String1; *String1 =
*(String1 + sz - 1); *(String1 + sz - 1) = '\0'; if (new_strlen(String1 + 1) >=
2) //这里需要重点分析, { Inversion(String1+1); } *(String1 + sz - 1) = temp; } int
new_strlen(char String1[]) { int sz = 0; if (*(String1)!='\0') { return sz = 1
+ new_strlen(String1 + 1); } else { return 0; } }

因为是递归实现所以,需要寻找大问题模块和小问题模块之间的粘连性!

每次递归要进行的操作是,交换数组中的第一个元素和最后一个元素并对中间的其余数组在操作。

 

 也就是说对于一级递归先是将temp=a[0],a[0]=a[5],a[5]='\0',此时我们在判断剩余数组的大小即可,当剩余数组的大小小于2时,就不再进行递归,最后在出递归的时候再将,a[5]=temp;

如果是int数组的话原理和char类型的相同,唯一不同的地方是数组大小每次要-2。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信