c语言 数组中字符串的旋转(左旋)(右旋)

     在数组中定义一个字符串,该字符串由“ abcdef ” 组成,所谓左旋即是让左边的第一个字符旋转到右边去,左旋一个字符即是产生“ bcdefa ”这样的字符串,右旋与之相反。

     为了控制左(右)旋的字符数,需要制作一个可以改变旋转字符数的函数。

     字符串的旋转的主要si思想是将需要寻转的字符先进行存储,然后将剩余的不需要旋转的字符移位,将需要旋转的字符的位置取代,为旋转的字符留下足够的空间来存储旋转字符。所以先建立一个数组,将旋转字符存储在内,然后将原数组内的元素移位后面的元素取代其前面的元素,但万不可将 " \0 " 移动或取代,要始终保证 " \0 " 在其原来的位置,然后将所存储的元素再次赋值到原数组中,完成旋转。最后再将数组元素循环打印在屏幕上。

#include<stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arrc[10] = "NULL";
	int sz = 0;
	scanf_s("%d", &sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arrc[i] = arr1[i];
	}
	for (i = 0; arr1[i + sz] != '\0'; i++)
	{
		arr1[i] = arr1[i + sz];
	}
	int j = 0;
	for (j = 0; j < sz; j++)
	{
		arr1[i] = arrc[j];
		i++;
	}
	for (i = 0; arr1[i] != '\0'; i++)
	{
		char tmp = NULL;
		tmp = arr1[i];
		printf("%c", tmp);
	}
	system("pause");
	return 0;
}

     右旋与左旋相反,但右旋的逻辑较难,在右旋中,先要计算原数组的元素个数,为后面的逻辑推导建立基础。

     右旋的数组从最右端的元素开始存储时,一定要跳过 " \0 " 然后进行拷贝存储,而所得到的sz是整个数组的长度,当

" sz-1 ",时所得到的yuan元素是指向 " \0 " 的·,这时再根据你要需要的旋转个数进行旋转,而在存储完成后,则要将原数组的元素进行移位,在这时,循环的判断条件是最大的移位次数,比如原有"abcdef"六个元素,而你需要旋转两个,则就要将剩下的四个元素移位四次。移位的次数是不会有多余的元素进行交换,然后移位时是将前面的元素将后移动:[sz - 1-1 - as - i]

这个表达式表示的是数组前面的元素,[sz - 1-1 - i],这个表达式表示的是后面的元素,将前面的元素赋值到后面的位置处,将原来的位置清理出来为所要旋转的元素的存储做准备。zhi'之后再将旋转的元素按照位置一 一赋值到原数组准备的位置处,完成旋转,然后循环打印在屏幕上。

#include<stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arrc[10] = "NULL";
	int i = 0;
	int as = 0;
	scanf_s("%d", &as);
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	for (i = 0; i < as; i++)
			{
				arrc [i] = arr1[sz-1-as+i];
			}
	for (i = 0;i!=sz-1-as;i++)
	{
		arr1[sz - 1-1 - i] = arr1[sz - 1-1 - as - i];
	}
	int j = 0;
	 i = 0;
		for (j = 0; j <as; j++)
		{
			arr1[i] = arrc[j];
			i++;
		}
	for (i = 0; arr1[i] != '\0'; i++)
	{
		char tmp = NULL;
		tmp = arr1[i];
		printf("%c", tmp);
	}
	system("pause");
	return 0;
}

       以上的两种方法叫做暴力旋转法,这种旋转的方法效率比较低,为了提高效率,可以用三部旋转法。三部移位就是利用巧字符元素中间的转换,只用三次就将字符串完成旋转,如果想要移位三个字符,第一步:就先将前(后)三个字符进行倒位,第二部:将剩下的字符进行倒位,第三部:将所有的字符进行倒位,就得到了移位后的字符串。这种方法的思想是 一个字符串如果倒位了两次,就相当于没有进行倒位,所以最后得到的 子 字符串的的字符顺序并未发生改变,而 总 的字符串的顺序发生了改变,使字符串的旋转变得简单高效。以下是代码示例(左旋);(认真阅读注释,有具体过程的解析)

#include<stdio.h>
#include<assert.h>
void ELoopMove(char *lift,char* right)//这是将字符串进行倒位的函数
{
	assert(lift&&right);
	while (lift < right)
	{
		char tmp = NULL;
		tmp = *lift;
		*lift = *right;
		*right = tmp;
		lift++;
		right--;
	}
}
void LoopMove(char *arr, int as,int i)
{
	assert(arr != NULL);
	ELoopMove(arr, arr + i - 1);//这代表的是旋转的 子 字符串的第一个字符和最后一个字符
	ELoopMove(arr + i, arr + as - 2);//这代表的是剩余的字符串的第一位和最后一位
	//如果是(arr+i,arr+as-1)的话,指针就指向了'\0'的位置,
	//所以要在"-1"的基础上再减一,使指针指向'\0'前的一个字符
	ELoopMove(arr, arr + as - 2);//这代表的是两次倒位后的总的字符串的第一位和最后一位
}
int main()
{
	char arr[] = "asdfghj";
	int i = 0;
	int sz = 0;
	scanf_s("%d", &i);
	sz = sizeof(arr);
	LoopMove(arr,sz, i);//通过传递地址的方式使内部变量被外部函数进行改变
	printf("%s\n", arr);//调用函数通过地址的改变从而将arr的值进行改变
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/f_shell_x/article/details/81264392