回复 16楼 九转星河
那个链表代码修改一下不用递归也能做全组合~以前写的~也许写得没有那么严谨~
程序代码:#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(Node)
int count=0;
#define N 5
typedef struct Node
{
int num;
struct Node *next;
struct Node *back;
}Node;
Node *head=NULL;
Node *back=NULL;
Node *p[5];
void set()
{
int i=0;
p[i]=head;
while (i<N-1)
{
p[i+1]=p[i]->next;
i++;
}
}
void creat()
{
Node *p1,*p2;
int i=0,n=N;
head=NULL;
p1=p2=malloc(LEN);
p1->back=NULL;
p1->num=1;
while (--n)
{
if (n==N-1)
head=p1;
else
{
p2->next=p1;
p1->back=p2;
}
p2=p1;
p1=malloc(LEN);
p1->num=N-n+1;
}
p2->next=p1;
p1->back=p2;
p1->next=NULL;
}
void print()
{
Node *p=head;
while (p)
{
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}
void print_p(int M)
{
int i;
for (i=0;i<M;i++)
printf("%d ",*p[i]);
printf("\n");
count++;
}
void fun_1(int M)
{
while(p[M-1]->next!=NULL)
{
print_p(M);
p[M-1]=p[M-1]->next;
}
print_p(M);
}
int fun_2(int M)
{
int i=1;
if (M==1)
return 0;
while (p[M-i]->back==p[M-i-1])
{
i++;
if (i==M)
return 0;
}
p[M-i-1]=p[M-i-1]->next;
while (i)
{
p[M-i]=p[M-i-1]->next;
i--;
}
return 1;
}
void my_free()
{
Node* p=head;
if (head==NULL)
return ;
while (p->next)
{
Node* p2=p;
p=p->next;
free(p2);
}
free(p);
head=NULL;
}
int main()
{
int M=0;
printf("NULL\n");
for (M=1;M<=N;++M)
{
creat();
set();
do
{
fun_1(M);
}while(fun_2(M));
my_free();
}
printf("\n共有%d种组合\n",count+1);
return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]








