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.递归实现数组逆置

编写一个函数 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。

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值