給定一個字符串,其含有的字符各不相同。程序輸出該字符串的所有排列(全排列)情形。例如:給定字符串“xyz”,則程序輸出:
xyz
xzy
yxz
yzx
zyx
zxy
試完善程序中空缺的部分。
void f(char *str, int len, int n)
{
int i;
char tmp;
char *p = (char *)malloc(__________);
if(n==len-1){
printf("%s\n",str);
}else{
for(i=n;i<len;i++){
strcpy(p,str);
tmp = *(str+n);
*(str+n) = *(str+i);
*(str+i) = tmp;
_______________;
strcpy(str,p);
}
}
free(p);
}
int main(int argc, char **argv)
{
char str[] = "xyz";
f(str,3,0);
printf("\n");
return 0;
}
分析:
第1空分配空間,由strcpy(p,str)知p指向字符串,所以1空爲len+1(len個字符+1個字符串結尾符);由於第2空之前的語句實現了當前字符與下一字符位置的調換,加上循
環i和變量n的存在,該空應爲遞歸,分析得該空爲f(str, len, i+1)。
解:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void f(char *str, int len, int n)
{
int i;
char tmp;
char *p = (char *)malloc(len+1);
if(n==len-1){
printf("%s\n",str);
}else{
for(i=n;i<len;i++){
strcpy(p,str);
tmp = *(str+n);
*(str+n) = *(str+i);
*(str+i) = tmp;
f(str, len, n+1);
strcpy(str,p);
}
}
free(p);
}
int main(int argc, char **argv)
{
char str[] = "xyz";
f(str,3,0);
printf("\n");
return 0;
}