【无标题】如何把一个数组元素进行倒置

int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s", arr);
	return 0;
}

首先,创建main函数,reverse_string(arr)是我们创建的函数,arr是数组首元素的地址,printf是打印函数,%s表示我们打印的是字符串,接下来看函数部分

void reverse_string(char arr[])
{
	int left = 0;
	int right = my_string(arr)-1;
	
	while (left < right)
	{
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}

函数部分的目的是实现数组的倒置,所以没有返回值,数组传参arr,我们既可以用 char arr[]来接收,也可以用char*str(数组地址)来接收

my_string(arr)是我们创建的函数,函数的目的是求字符串的元素个数,这道题的前提条件不允许使用库函数,所以我们要自己创建函数来求字符串的元素个数

求出的字符串长度-1是最后一个元素的下标,因为第一个元素的参数为0,所以最后一个参数的元素=字符串长度-1

我们创建while(left<right)循环,我们的目的是让arr[left]和arr[right]逐个交换,当他们相等时,元素已经倒置完毕了,我们创建临时变量来实现交换:int tmp相当于一个瓶子,arr[left]相当于可乐arr[right]相当于雪碧,我们要实现可乐和雪碧互换,先把可乐放进瓶子,再把雪碧倒进可乐瓶子中,最后把tmp中的可乐放入雪碧瓶子中,创建临时变量实现交换是这样产生的,我们让left++ right--从而实现元素向右向左移动,整个函数部分执行完毕就能顺利的倒置数组元素

但我们的my_string函数还没有创建,我对函数这样创建

int my_string(char*str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

因为我们的目的是算出字符串的元素个数,返回值应该是整数,所以用int类型,这里用char*str来接受数组首元素的地址,char*表示我们接收的是char型的指针

字符串的末尾是'\0',*str是解引用操作,访问str的地址,找到其对应的元素,当其=’ 0‘时,表示字符串已经结束,通过返回count值得到字符串的元素个数。

fedcba请按任意键继续. . .

代码执行结果,实现倒置

接下来我们用递归的方法解决

my_string这个计算字符串元素个数的函数不用改变,我们来重新设计reverse_string函数

void reverse_string(char arr[])
{
	char tmp = arr[0];
	int len = my_string(arr);
	arr[0] = arr[len - 1];
	arr[len - 1] = '\0';
	if (my_string(arr + 1) >= 2)
	{
		reverse_string(arr + 1);
	}
	arr[len - 1] = tmp;
}

我们先写出函数,再进行说明。

我们依然要用临时变量来实现两数的交换,不同的是这次使用的方法及顺序不同

char tmp = arr[0];表示我们创建一个临时变量,变量的参数类型为char 把arr[0]的元素放在tmp中。 int len = my_string(arr);因为我们的my_string函数的返回值是数组元素的个数,所以我们用int来接收,这里的len即是数组元素的个数

arr[0] = arr[len - 1];我们的数组首元素已经存放在临时变量里了,len-1即为数组最后元素的下标,把数组最后的元素放在首元素所在位置

arr[len - 1] = '\0';我们再'\0'放在数组最后元素的位置,为什么要这样做,接下来再说

if (my_string(arr + 1) >= 2)
    {
        reverse_string(arr + 1);
    }   :接下来实现递归,递归是要有限制条件的,这里的my_string(arr + 1)是计算数组除去a和f的元素个数,为什么这样说呢?arr是数组首元素的地址,+1表示数字第二个元素,又因为我们在尾元素的位置存放了\0,所以在访问到数组尾元素时,数组直接结束,数组首元素尾元素则不再计算范围内,我们存放\0的目的在这里体现,为什么要>=2,因为只有两个和两个以上的数字才能实现倒置。

 reverse_string(arr + 1);表示调用函数,实现递归,最后的结果是把数组所有的元素都实现倒置

最后再把tmp传给数组尾元素,是因为我们在实现递归时,在数组尾元素的位置放的是\0,实现递归后再把原本该放在数组尾元素的tmp放进去

fedcba请按任意键继续. . .

结果如图所示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值