Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397961
  • 博文数量: 58
  • 博客积分: 1775
  • 博客等级: 上尉
  • 技术积分: 755
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-12 15:03
文章分类

全部博文(58)

文章存档

2012年(5)

2011年(43)

2010年(10)

分类: C/C++

2011-10-09 15:18:32

#include
#include

void transform(char *p,int x);    //一个置换函数,把元素前移一位,并把第一位放到最后
void trans_all(char *p,int x,int n,void (*fun)(char *,int));    //置换函数的组合和迭代 覆盖所有排列的算法
void print(char *p,int x);//定义输出序列的函数
int main()
{
    char sequence[] = {'A','B','C'};
    int i=0;

    trans_all(sequence,1,3,print);              //输出所有的排列 ,我能在这里再提供参数吗,尝试了很多方式,都失败了
    return(0);
}
void transform(char *p,int x) //置换函数,左移元素,并把首元放到最后,p序列地址,x为序列长度
{
       int i;
       char s;
       s=p[0];
       for(i=0;i           p[i]=p[i 1];
       p[x-1]=s;
}
void trans_all(char *p,int x,int n,void (*fun)(char *,int)) //搞了一个下午终于行了,p还是序列地址,x是子序列参数(迭代的时候用)
{                                                    //n是原序列的长度 ,fun是某个函数的指针 但是从声明无法知晓这个函数的参数,怎么解决呢
       int i;                                        // Perfect! Right?
       for(i=0;i       {
             if(x                     trans_all(p,x 1,n,fun);       //递归,有点像动态自动生成的代码,这里用来控制循环的嵌套数
             else                                  //令人庆幸的事 它工作了!!!!
                     (*fun)(p,n);          //所使用的函数的参数已经限定了,不知道有什么办法能避免这种情况
             transform(p,x);            //要是能把参数和指针一起传递给函数就好了,呵呵
       }
}
void print(char *p,int x) //输出函数
{
       int t;
       for(t=0;t            printf("%c ",p[t]); // 这里可对每一个排列的操作,这个程序中我只是简单的输出了
       printf("\n");
}

阅读(1563) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~