C全排列问题请给出下面这个程序的注释 #include inline void swap(int &a,int &b){int temp=a;a=b;b=temp;}void perm(int list[],int k,int m){if(k==m){for(int i=0;i
C全排列问题请给出下面这个程序的注释 #include inline void swap(int &a,int &b){int temp=a;a=b;b=temp;}void perm(int list[],int k,int m){if(k==m){for(int i=0;i
C全排列问题
请给出下面这个程序的注释
#include
inline void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
void perm(int list[],int k,int m)
{
if(k==m)
{
for(int i=0;i
C全排列问题请给出下面这个程序的注释 #include inline void swap(int &a,int &b){int temp=a;a=b;b=temp;}void perm(int list[],int k,int m){if(k==m){for(int i=0;i
对调,对实参无任何影响.
解决上述问题有两个方法:
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=0;i<n;i++)
printf("%d",*(p+i));
printf("\n");
}
else
{
for(i=k;i<n;i++)
{
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=0;i<3;i++)
list[i]=i+1;
p=list; //原为p=list[0].这里应将数组list的首地址赋值给指针p,所以就写成p=list或p=&list[0].
perm(p,0,3);
}
另外,虚机团上产品团购,超级便宜