您的位置:首页 > 其它

用递归的思想写编写一个函数reverse_string(char * string)实现字符串反向输出和反向排列

2015-03-13 09:52 971 查看


字符串反向输出:

#include<stdio.h>
void reverse_string(char *string)
{
if ('\0'!=*(++string))
reverse_string(string);//递归调用,每次调用都要输出
printf("%c",*(string-1));
}

int main()
{
char *a = "abcde";
reverse_string(a);
printf("\n");
return 0;
}

每次调用 递归 编译器就会归 函数重新分配一片空间来放这个函数 直至 if 条件不成立

内存中类似以上这种图 最里层以这个函数为例 就是 *string=='\0'了就执行 printf("%c",*(string-1)) 把最后一个 字符打印出来 ,而此时右跳入次里层,*string的值是'\0'前边的字符,紧接又输出 以此类推

字符串反向排列:

#include<stdio.h>
#include<string.h>

char* reverse1(char *str) //字符串反向排列,自己函数strlen()
{
char *p=str;
int n=0;
while(*p++!='\0')
{
n++;
}
if(n>1)
{
char temp=str[0];
str[0]=str[n-1];
str[n-1]='\0';
reverse1(str+1);
str[n-1]=temp;

}
return str;
}

char * reverse(char *str) //字符串反向排列,用库函数strlen()
{
int len = strlen(str);
if( !*str )
{
return NULL;
}
if( len > 1 )
{
char ctemp =str[0];
str[0] = str[len-1];
str[len-1] = '\0';// 最后一个字符在下次递归时不再处理
reverse(str+1); // 递归调用
str[len-1] = ctemp;
}
return str;
}

int main()
{
char string[]="123456";
printf("String=%s\n",reverse1(string));
printf("String=%s\n",reverse(string));
return 0;
}



如上图所示,每次进入递归计算一次新的字符串长度,紧接着这个新字符串的最后一个元素就会被赋值为\0,每次空间就会建立一个临时变量temp,来存储新字符串第一个元素的值,因为每次交换第一个字符就会将最后一个自负的值赋于新的字符串的首元素,而首元素的值直到退出递归时才会有临死变量赋给每个新字符串的最后一个元素

最终递归不继续压栈即将退栈时数组内部的存储图如下图:



待到退栈时候每次空间的临时变量就会把值分别赋给str[3]  str[4]  str[5]这就实现了交换

     6                5                3          2           1      \0

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐