C語言編程 遞歸方法與非遞歸方法 實現將參數字符串中的字符反向排列
阿新 • • 發佈:2019-04-11
%s png images while char s proc 意義 strlen process //題目要求要求:不能使用C函數庫中的字符串操作函數
(否則本題也沒什麽意義了啊)
(否則本題也沒什麽意義了啊)
<1>非遞歸方法
此方法基本思想是設立兩個指針,分別指向字符串的頭尾
並且依次交換所指向的數據,代碼中為left和right
源代碼:
#include<stdio.h> #include<stdlib.h> #include<string.h>//因為要使用strlen()語句 void reverse_string(char str[]) { int temp; char *left = str; char *right = str + strlen(str) - 1; while (*left <* right) { temp = *left; *left = *right; *right = temp; *right--; *left++; } } int main() { char str[] = "chooseyou"; printf("%s\n", str); reverse_string(str); printf("%s", str); system("pause"); return 0; }
<2>遞歸方法
遞歸方法思想如下圖
類似於非遞歸的left與right指針所指數據互換
遞歸時只訂立一個指針,每一次通過未交換字符串的長度(len)來表示所指向的元素的字符串倒數除\0外第一個元素。
每一次的遞歸將指針所指的元素儲存進一個變量,並且將倒數第一個元素(除\0外),與所知元素換再把最後元素置為\0,然後改變len進行下次遞歸。
最後的效果是字符串由長變短再變長得以完成反向排列
詳解如圖
源代碼:
#include<stdio.h> #include<stdlib.h> void reverse_string(char *str) { int len = strlen(str); char temp=*str;//當前所指元素 *str = *(str + len - 1);//除\0外最後一個元素 *(str + len - 1) = ‘\0‘;//置\0 if (strlen(str + 1) >= 2)//長度小於等於1則不需要交換 { reverse_string(str + 1); } *(str + len - 1) = temp;//將儲存的元素反序序放回字符串完成反向排序 } int main() { char str[] = "chooseyou"; printf("%s\n", str); reverse_string(str); printf("%s\n", str); system("pause"); return 0; }
註意:要修改的字符串要以數組類型存儲(str[]),*str儲存為只讀類型,強行寫值會出錯
C語言編程 遞歸方法與非遞歸方法 實現將參數字符串中的字符反向排列