#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define N 20
int my_isspace(char c) {
return (c == ' ' || c == ',' || c == '.' || c == '\n');
}
int read_word(FILE *fp,char buf[N]){
int i=0;
for(i=0;i<N;i++){
buf[i] = '\0';
}
char c;
while (c
= fgetc(fp
), c
!= EOF
&& my_isspace
(c
)) ;
if (c == EOF)
return 0;
buf[0] = c;
i = 1;
while(((c
= fgetc(fp
)) != EOF
) && i
< N
- 1) { buf[i] = c;
if(my_isspace(c)){
buf[i] = '\0';
break;
}
i++;
}
if (c == EOF) {
buf[i] = '\0';
}
if (i == N - 1) {
buf[N - 1] = '\0';
}
return i;
}
struct word {
char name[N];
int count;
struct word *next;
};
struct word *create_word(char buf[N]) {
struct word *p;
if ((p
= malloc(sizeof(struct word
))) == 0) { printf("memory full, aborted.\n"); }
p->count = 1;
return p;
}
void insertword(struct word **root, char buf[N]) {
struct word *p;
p = create_word(buf);
p->next = *root;
*root = p;
}
void addword(struct word **root, char buf[N]) {
int c;
if (*root == 0) {
insertword(root, buf);
} else {
c
= strcmp((*root
)->name
, buf
); if (c == 0) {
(*root)->count++;
return;
} else if (c > 0) {
insertword(root, buf);
} else {
addword(&((*root)->next), buf);
}
}
}
struct Output {
char *word;
};
struct Output Message[400];
int idx = 0;
void dump(struct word *p) {
if (p == 0)
return;
printf("%s(%d)\n", p
->name
, p
->count
); Message[idx++].word = p->name;
dump(p->next);
}
int main() {
char buf[N];
FILE *fp;
fp
= fopen("anne_short.txt","r"); if(fp == NULL){
}
int n;
struct word *root;
root = 0;
for (;;) {
n = read_word(fp, buf);
if (n == 0)
break;
addword(&root, buf);
}
dump(root);
for (int i = 0; i < idx; i++) {
printf("%s: ", Message
[i
].
word); if (i
> 0) printf("%s", (strcmp(Message
[i
- 1].
word, Message
[i
].
word) < 0) ? "OK" : "NoGOOD"); }
return 0;
}
/* end */
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKI2RlZmluZSBOIDIwCiAKaW50IG15X2lzc3BhY2UoY2hhciBjKSB7CiAgcmV0dXJuIChjID09ICcgJyB8fCBjID09ICcsJyB8fCBjID09ICcuJyB8fCBjID09ICdcbicpOwp9CiAKaW50IHJlYWRfd29yZChGSUxFICpmcCxjaGFyIGJ1ZltOXSl7CiAgaW50IGk9MDsKICBmb3IoaT0wO2k8TjtpKyspewogICAgYnVmW2ldID0gJ1wwJzsKICB9CiAKICBjaGFyIGM7CiAgd2hpbGUgKGMgPSBmZ2V0YyhmcCksIGMgIT0gRU9GICYmIG15X2lzc3BhY2UoYykpCiAgICA7CiAgaWYgKGMgPT0gRU9GKQogICAgcmV0dXJuIDA7CiAgYnVmWzBdID0gYzsKICBpID0gMTsKICB3aGlsZSgoKGMgPSBmZ2V0YyhmcCkpICE9IEVPRikgJiYgaSA8IE4gLSAxKSB7CiAgICBidWZbaV0gPSBjOwogICAgaWYobXlfaXNzcGFjZShjKSl7CiAgICAgIGJ1ZltpXSA9ICdcMCc7CiAgICAgIGJyZWFrOwogICAgfQogICAgaSsrOwogIH0KICBpZiAoYyA9PSBFT0YpIHsKICAgIGJ1ZltpXSA9ICdcMCc7CiAgfQogIGlmIChpID09IE4gLSAxKSB7CiAgICB1bmdldGMoYywgZnApOwogICAgYnVmW04gLSAxXSA9ICdcMCc7CiAgfQogIHJldHVybiBpOwp9CiAKc3RydWN0IHdvcmQgewogIGNoYXIgbmFtZVtOXTsKICBpbnQgY291bnQ7CiAgc3RydWN0IHdvcmQgKm5leHQ7Cn07CiAKc3RydWN0IHdvcmQgKmNyZWF0ZV93b3JkKGNoYXIgYnVmW05dKSB7CiAgc3RydWN0IHdvcmQgKnA7CiAgaWYgKChwID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd29yZCkpKSA9PSAwKSB7CiAgICBwcmludGYoIm1lbW9yeSBmdWxsLCBhYm9ydGVkLlxuIik7CiAgICBleGl0KDEpOwogIH0KICBzdHJjcHkocC0+bmFtZSwgYnVmKTsKICBwLT5jb3VudCA9IDE7CiAgcmV0dXJuIHA7Cn0KIAp2b2lkIGluc2VydHdvcmQoc3RydWN0IHdvcmQgKipyb290LCBjaGFyIGJ1ZltOXSkgewogIHN0cnVjdCB3b3JkICpwOwogIHAgPSBjcmVhdGVfd29yZChidWYpOwogIHAtPm5leHQgPSAqcm9vdDsKICAqcm9vdCA9IHA7Cn0KIAogCnZvaWQgYWRkd29yZChzdHJ1Y3Qgd29yZCAqKnJvb3QsIGNoYXIgYnVmW05dKSB7CiAgaW50IGM7CiAgaWYgKCpyb290ID09IDApIHsKICAgIGluc2VydHdvcmQocm9vdCwgYnVmKTsKICB9IGVsc2UgewogICAgYyA9IHN0cmNtcCgoKnJvb3QpLT5uYW1lLCBidWYpOwogICAgaWYgKGMgPT0gMCkgewogICAgICAoKnJvb3QpLT5jb3VudCsrOwogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKGMgPiAwKSB7CiAgICAgIGluc2VydHdvcmQocm9vdCwgYnVmKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZHdvcmQoJigoKnJvb3QpLT5uZXh0KSwgYnVmKTsKICAgIH0KICB9Cn0KCnN0cnVjdCBPdXRwdXQgewogIGNoYXIgKndvcmQ7Cn07CnN0cnVjdCBPdXRwdXQgTWVzc2FnZVs0MDBdOwppbnQgaWR4ID0gMDsKCnZvaWQgZHVtcChzdHJ1Y3Qgd29yZCAqcCkgewogIGlmIChwID09IDApCiAgICByZXR1cm47CiAgcHJpbnRmKCIlcyglZClcbiIsIHAtPm5hbWUsIHAtPmNvdW50KTsKICBNZXNzYWdlW2lkeCsrXS53b3JkID0gcC0+bmFtZTsKICBkdW1wKHAtPm5leHQpOwp9CiAKaW50IG1haW4oKSB7CiAgY2hhciBidWZbTl07CiAgRklMRSAqZnA7CiAKICBmcCA9IGZvcGVuKCJhbm5lX3Nob3J0LnR4dCIsInIiKTsKICBpZihmcCA9PSBOVUxMKXsKICAgIHByaW50ZigiRmlsZSByZWFkIGVycm9yIVxuIik7CiAgICBleGl0KDEpOwogIH0KIAogIGludCBuOwogIHN0cnVjdCB3b3JkICpyb290OwogIHJvb3QgPSAwOwogCiAgZm9yICg7OykgewogICAgbiA9IHJlYWRfd29yZChmcCwgYnVmKTsKICAgIGlmIChuID09IDApCiAgICAgIGJyZWFrOwogICAgYWRkd29yZCgmcm9vdCwgYnVmKTsKICB9CiAgZHVtcChyb290KTsKICAKICBmb3IgKGludCBpID0gMDsgaSA8IGlkeDsgaSsrKSB7CiAgICBwcmludGYoIiVzOiAiLCBNZXNzYWdlW2ldLndvcmQpOwogICAgaWYgKGkgPiAwKSBwcmludGYoIiVzIiwgKHN0cmNtcChNZXNzYWdlW2kgLSAxXS53b3JkLCBNZXNzYWdlW2ldLndvcmQpIDwgMCkgPyAiT0siIDogIk5vR09PRCIpOwogICAgcHV0Y2hhcignXG4nKTsKICB9CiAgZmNsb3NlKGZwKTsKICByZXR1cm4gMDsKfQovKiBlbmQgKi8KCg==