struct ppair {
char c;
int first;
int last;
int num_inner_pairs;
ppair ** inner_pairs;
};
void add_to_inner( ppair * outer, ppair * inner) {
ppair ** temp;
int i;
temp = ( ppair * *)malloc((outer->num_inner_pairs + 1) * sizeof( ppair *));
for(i = 0; i <>num_inner_pairs; i++) {
temp[i] = outer->inner_pairs[i];
}
if (outer->num_inner_pairs > 0) {
free(outer->inner_pairs);
}
temp[outer->num_inner_pairs++] = inner;
outer->inner_pairs = temp;
}
void print_palendromes(const ppair * p, char * pre) {
int i;
printf("%s", pre); putc(p->c, stdout);
if (p->first <>last) {
putc(p->c, stdout);
}
for(i = strlen(pre); i > 0; i--) putc(pre[i-1], stdout);
printf("\n");
pre[strlen(pre)] = p->c;
for(i = 0; i <>num_inner_pairs; i++) {
print_palendromes(p->inner_pairs[i], pre);
}
pre[strlen(pre) - 1] = 0;
}
int pallindrome(int argc, const char ** argv) {
int i, j, k;
ppair g, * p;
char * buf;
if (argc != 2) {
fprintf(stderr, "usage: %s string\n", argv[0]);
return -1;
}
g.first = -1;
g.last = strlen(argv[1]);
g.num_inner_pairs = 0;
for(i = 0; i < strlen(argv[1]); i++) {
for(j = i; j < strlen(argv[1]); j++) {
if (argv[1][i] == argv[1][j]) {
ppair * p = ( ppair *)malloc(sizeof( ppair));
p->c = argv[1][i];
p->first = i;
p->last = j;
p->num_inner_pairs = 0;
for(k = 0; k < g.num_inner_pairs; k++) {
if (g.inner_pairs[k]->first <>last) {
add_to_inner(g.inner_pairs[k], p);
}
}
add_to_inner(&g, p);
}
}
}
buf = (char *)malloc(strlen(argv[1]) + 1);
memset(buf, 0, strlen(argv[1]) + 1);
for(k = 0; k < g.num_inner_pairs; k++) {
if (g.inner_pairs[k]->first <>last) {
print_palendromes(g.inner_pairs[k], buf);
}
}
for(k = 0; k < g.num_inner_pairs; k++) {
if (g.inner_pairs[k]->num_inner_pairs > 0) {
free(g.inner_pairs[k]->inner_pairs);
}
free(g.inner_pairs[k]);
}
free(g.inner_pairs);
free(buf);
return 0;
}
No comments:
Post a Comment