C语⾔——数组逆置(内含递归实现)⼀.什么是数组的逆置呢?
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语言编写递归函数
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。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。