回复 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]