1. 程式人生 > >c語言 陣列中字串的旋轉(左旋)(右旋)

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;
}