#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define N 1024
char *myfgets(void) {
static char buff[N];
return fgets(buff
, N
, stdin
); }
struct list {
char *word;
struct list *next;
};
void myswap(struct list *p, struct list *q) {
char *tmp;
tmp = p->word;
p->word = q->word;
q->word = tmp;
}
void bsort2(struct list *r, int sw) {
struct list *p, *q;
int c;
for (p = r, q = r->next; p->next != 0; p = p->next, q = q->next) { /* note: p->next != 0 */
c
= sw
* strcmp(p
->word
, q
->word
); if (c > 0)
myswap(p, q);
}
}
void bsort(struct list *root, int sw) {
struct list *axis;
if (root == 0)
return;
for (axis = root; axis != 0; axis = axis->next) {
bsort2(root, sw);
}
}
void addword(struct list **root, char *word) {
char *p;
struct list *q;
fprintf(stderr
, "memory full, aborted\n"); }
if ((q
= malloc(sizeof(struct list
))) == 0) { fprintf(stderr
, "memory full, aborted\n"); }
q->word = p;
q->next = *root;
*root = q;
}
void dump(struct list *root) {
if (root != 0) {
dump(root->next);
}
}
void chop(char *p) {
while (*p != 0)
p++;
p--;
if (*p == '\n' || *p == '\r') *p = '\0';
p--;
if (*p == '\n' || *p == '\r') *p = '\0';
*p = 0;
}
void release(struct list **root) {
struct list *p;
if (*root != 0) {
p = (*root)->next;
(*root)->next = 0;
release(&p);
}
}
int main(int argc, char *argv[]) {
char *p;
struct list *root;
int sw;
root = 0;
while ((p = myfgets()) != 0) {
chop(p);
addword(&root, p);
}
sw = +1;
else
sw = -1;
/* dump(root); */
bsort(root, sw);
dump(root);
release(&root);
}
/* end */
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgojZGVmaW5lIE4gMTAyNApjaGFyICpteWZnZXRzKHZvaWQpIHsKICBzdGF0aWMgY2hhciBidWZmW05dOwogIHJldHVybiBmZ2V0cyhidWZmLCBOLCBzdGRpbik7Cn0KCnN0cnVjdCBsaXN0IHsKICBjaGFyICp3b3JkOwogIHN0cnVjdCBsaXN0ICpuZXh0Owp9OwoKdm9pZCBteXN3YXAoc3RydWN0IGxpc3QgKnAsIHN0cnVjdCBsaXN0ICpxKSB7CiAgY2hhciAqdG1wOwogIHRtcCA9IHAtPndvcmQ7CiAgcC0+d29yZCA9IHEtPndvcmQ7CiAgcS0+d29yZCA9IHRtcDsKfQoKdm9pZCBic29ydDIoc3RydWN0IGxpc3QgKnIsIGludCBzdykgewogIHN0cnVjdCBsaXN0ICpwLCAqcTsKICBpbnQgYzsKCiAgZm9yIChwID0gciwgcSA9IHItPm5leHQ7IHAtPm5leHQgIT0gMDsgcCA9IHAtPm5leHQsIHEgPSBxLT5uZXh0KSB7IC8qIG5vdGU6IHAtPm5leHQgIT0gMCAqLwogICAgYyA9IHN3ICogc3RyY21wKHAtPndvcmQsIHEtPndvcmQpOwogICAgaWYgKGMgPiAwKQogICAgICBteXN3YXAocCwgcSk7CiAgfQp9Cgp2b2lkIGJzb3J0KHN0cnVjdCBsaXN0ICpyb290LCBpbnQgc3cpIHsKICBzdHJ1Y3QgbGlzdCAqYXhpczsKICBpZiAocm9vdCA9PSAwKQogICAgcmV0dXJuOwogIGZvciAoYXhpcyA9IHJvb3Q7IGF4aXMgIT0gMDsgYXhpcyA9IGF4aXMtPm5leHQpIHsKICAgIGJzb3J0Mihyb290LCBzdyk7CiAgfQp9Cgp2b2lkIGFkZHdvcmQoc3RydWN0IGxpc3QgKipyb290LCBjaGFyICp3b3JkKSB7CiAgY2hhciAqcDsKICBzdHJ1Y3QgbGlzdCAqcTsKICBpZiAoKHAgPSBtYWxsb2Moc3RybGVuKHdvcmQpICsgMSkpID09IDApIHsKICAgIGZwcmludGYoc3RkZXJyLCAibWVtb3J5IGZ1bGwsIGFib3J0ZWRcbiIpOwogICAgZXhpdCgtMSk7CiAgfQogIHN0cmNweShwLCB3b3JkKTsKICBpZiAoKHEgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0KSkpID09IDApIHsKICAgIGZwcmludGYoc3RkZXJyLCAibWVtb3J5IGZ1bGwsIGFib3J0ZWRcbiIpOwogICAgZXhpdCgtMSk7CiAgfQogIHEtPndvcmQgPSBwOwogIHEtPm5leHQgPSAqcm9vdDsKICAqcm9vdCA9IHE7Cn0KCnZvaWQgZHVtcChzdHJ1Y3QgbGlzdCAqcm9vdCkgewogIGlmIChyb290ICE9IDApIHsKICAgIHByaW50ZigiJXNcbiIsIHJvb3QtPndvcmQpOwogICAgZHVtcChyb290LT5uZXh0KTsKICB9Cn0KCnZvaWQgY2hvcChjaGFyICpwKSB7CiAgd2hpbGUgKCpwICE9IDApCiAgICBwKys7CiAgcC0tOwogIGlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdccicpICpwID0gJ1wwJzsKICBwLS07CiAgaWYgKCpwID09ICdcbicgfHwgKnAgPT0gJ1xyJykgKnAgPSAnXDAnOwogICpwID0gMDsKfQoKdm9pZCByZWxlYXNlKHN0cnVjdCBsaXN0ICoqcm9vdCkgewogIHN0cnVjdCBsaXN0ICpwOwogIGlmICgqcm9vdCAhPSAwKSB7CiAgICBmcmVlKCgqcm9vdCktPndvcmQpOwogICAgcCA9ICgqcm9vdCktPm5leHQ7CiAgICAoKnJvb3QpLT5uZXh0ID0gMDsKICAgIGZyZWUoKnJvb3QpOwogICAgcmVsZWFzZSgmcCk7CiAgfQp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgY2hhciAqcDsKICBzdHJ1Y3QgbGlzdCAqcm9vdDsKICBpbnQgc3c7CgogIHJvb3QgPSAwOwoKICB3aGlsZSAoKHAgPSBteWZnZXRzKCkpICE9IDApIHsKICAgIGNob3AocCk7CiAgICBhZGR3b3JkKCZyb290LCBwKTsKICB9ICAgIAogIGlmIChhdG9pKGFyZ3ZbMV0pID4gMCkKICAgIHN3ID0gKzE7CiAgZWxzZQogICAgc3cgPSAtMTsKCi8qICBkdW1wKHJvb3QpOyAqLwogIGJzb3J0KHJvb3QsIHN3KTsKICBkdW1wKHJvb3QpOwogIHJlbGVhc2UoJnJvb3QpOwp9Ci8qIGVuZCAqLwo=