1. 程式人生 > >C語言編程 遞歸方法與非遞歸方法 實現將參數字符串中的字符反向排列

C語言編程 遞歸方法與非遞歸方法 實現將參數字符串中的字符反向排列

%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語言編程 遞歸方法與非遞歸方法 實現將參數字符串中的字符反向排列