#include #include #include #include "common.h" void print_permutations(const char *); void print_next_permutations(const char *, const unsigned *); int main (void) { printf("Input a word: "); char * line = get_line(NULL); if (!strlen(line)) { free(line); return 1; } print_permutations(line); free(line); return 0; } void print_permutations (const char * word) { unsigned count[256]; const char * current; memset(count, 0, 256 * sizeof(unsigned)); for (current = word; *current; current ++) count[*current] ++; *count = strlen(word); print_next_permutations("", count); } void print_next_permutations (const char * head, const unsigned * list) { if (!*list) { printf("%s\n", head); return; } unsigned insert_point = strlen(head); int character; char * string = malloc(insert_point + 2); unsigned new_count[256]; memcpy(new_count, list, sizeof(unsigned) * 256); memcpy(string, head, insert_point); string[insert_point + 1] = 0; (*new_count) --; for (character = 1; character < 256; character ++) { if (!new_count[character]) continue; new_count[character] --; string[insert_point] = character; print_next_permutations(string, new_count); new_count[character] ++; } free(string); }