C语言全排列问题

来源:百度知道 编辑:UC知道 时间:2024/05/10 13:56:31
#include "stdio.h"
swap(int a,int b)
{int t;
t=a;
a=b;
b=t;
}
perm(int *p,int k,int n)
{int m,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);
swap(*(p+k),*(p+i));
}
}
}
main()
{int i,list[3],*p;
for(i=0;i<3;i++)
list[i]=i+1;
p=list[0];
perm(p,0,3);

}
这是我写的全排列,但是好像指针有地方弄错了,我看不出来,高手来救啊!
#include "stdio.h"
swap(int *a,int *b)
{int t;
t=*a;
*a=*b;
*b=t;
}
perm(int *p,int k,int n)
{int m,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);
swap((p+k),(p+i));
}

你的程序在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=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));