/* Algorithm 4.1 in Ruskey's textbook: Next for subsets by counting. */ #include #include #define MAX 20 enum BOOLEAN {FALSE, TRUE}; enum BOOLEAN done; void PrintIt(int Array[], int n) { int i; for (i = 0; i < n; i ++) printf(" %d", Array[i]); printf("\n"); } void Next(int Array[], int n) { int k = n-1; while (Array[k] == 1) { Array[k] = 0; k --; } if (k == -1) done = TRUE; else Array[k] = 1; } int main(int argc, char *argv[]) { int n, i; int B[MAX+1]; if (argc != 2) { printf("\n A single argument expected.\n"); return 1; } n = atoi(argv[1]); if (n < 0) { printf("\n Positive number expected.\n"); return 2; } if (n > MAX) { printf("\n The number cannot exceed %d.\n", MAX); return 3; } /* Initialize */ for (i = 0; i < MAX+1; i ++) B[i] = 0; done = FALSE; /* Main loop */ do { PrintIt(B+1,n); Next(B+1, n); } while (!done); return 0; }