你的全排列算法不成立,我给你一个全排列的例子,你看看吧.
#include<iostream>#include<cstring>
using namespace 圆宏举std
static int count=0
void Swap(char *a,char *b)
{
char tmp=*a
*a=*b
*b=tmp
}
void AllRange(char *pszStr,int k,int m)
{
if(k==m)
{
橘碧绝桥 count++
cout<<pszStr<<endl
}
else
{
for(int i=ki<=mi++)
{
Swap(pszStr+i,pszStr+k)
AllRange(pszStr,k+1,m)
Swap(pszStr+i,pszStr+k)
}
}
}
int main()
{
int n
cin>>n
char *szTextStr
sprintf(szTextStr,"%d",n)
cout<<szTextStr<<"的全排列如下:"<<endl
AllRange(szTextStr,0,strlen(szTextStr)-1)
cout<<"共"<<count<<"个"<<endl
return 0
}
你的程序在swap()函数中只是将形参进行了值的对调,对实参无任何影响.解决上述问题有两个方法:
1.正如楼大码纤上所说的,在C++环境下,可以将swap的两个参数滚仿改成引用类型,这样对它们的 *** 作将实际作用于实参,实现如下:
函数定义:swap(int &a,int &b)
函数调用示例:swap(*(p+k)*(p+i))其中p是指针,k,i是整形偏移量.
2.在纯C环境下,可以将swap的两个参数改为模拿指针类型,而在函数内部使用对其指向的地址中数据的解引用 *** 作,实现对原变量的对调 *** 作,实现如下:
函数定义:
swap(int *a,int *b)
{int t
t=*a
*a=*b
*b=t
}
函数调用示例:swap(p+k,p+i)其中p是指针,k,i是整形偏移量.
你的程序中还有两处涉及到指针使用的错误,我把改过的程序贴上来,错误已在注释中标注.
#include "stdio.h"
swap(int *a,int *b)
{
int t
t=*a
*a=*b
*b=t
}
perm(int *p,int k,int n)
{
int i
if(k==n-1)
{
for(i=0i<ni++)
printf("%d",*(p+i))
printf("\n")
}
else
{
for(i=ki<ni++)
{
swap((p+k),(p+i))
perm(p,k+1,n)//原为perm(*p,k+1,n).在此应传递的是指针p指向的地址,而不是该地址中的内容.
swap((p+k),(p+i))
}
}
}
main()
{
int i,list[3],*p
for(i=0i<3i++)
list[i]=i+1
p=list//原为p=list[0].这里应将数组list的首地址赋值给指针p,所以就写成p=list或p=&list[0].
perm(p,0,3)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)