#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);
}
}
}
void dump(struct word *p) {
if (p == 0)
return;
printf("%s(%d)\n", p
->name
, p
->count
); 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);
return 0;
}
/* end */
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgojZGVmaW5lIE4gMjAKCmludCBteV9pc3NwYWNlKGNoYXIgYykgewogIHJldHVybiAoYyA9PSAnICcgfHwgYyA9PSAnLCcgfHwgYyA9PSAnLicgfHwgYyA9PSAnXG4nKTsKfQoKaW50IHJlYWRfd29yZChGSUxFICpmcCxjaGFyIGJ1ZltOXSl7CiAgaW50IGk9MDsKICBmb3IoaT0wO2k8TjtpKyspewogICAgYnVmW2ldID0gJ1wwJzsKICB9CgogIGNoYXIgYzsKICB3aGlsZSAoYyA9IGZnZXRjKGZwKSwgYyAhPSBFT0YgJiYgbXlfaXNzcGFjZShjKSkKICAgIDsKICBpZiAoYyA9PSBFT0YpCiAgICByZXR1cm4gMDsKICBidWZbMF0gPSBjOwogIGkgPSAxOwogIHdoaWxlKCgoYyA9IGZnZXRjKGZwKSkgIT0gRU9GKSAmJiBpIDwgTiAtIDEpIHsKICAgIGJ1ZltpXSA9IGM7CiAgICBpZihteV9pc3NwYWNlKGMpKXsKICAgICAgYnVmW2ldID0gJ1wwJzsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpKys7CiAgfQogIGlmIChjID09IEVPRikgewogICAgYnVmW2ldID0gJ1wwJzsKICB9CiAgaWYgKGkgPT0gTiAtIDEpIHsKICAgIHVuZ2V0YyhjLCBmcCk7CiAgICBidWZbTiAtIDFdID0gJ1wwJzsKICB9CiAgcmV0dXJuIGk7Cn0KCnN0cnVjdCB3b3JkIHsKICBjaGFyIG5hbWVbTl07CiAgaW50IGNvdW50OwogIHN0cnVjdCB3b3JkICpuZXh0Owp9OwoKc3RydWN0IHdvcmQgKmNyZWF0ZV93b3JkKGNoYXIgYnVmW05dKSB7CiAgc3RydWN0IHdvcmQgKnA7CiAgaWYgKChwID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd29yZCkpKSA9PSAwKSB7CiAgICBwcmludGYoIm1lbW9yeSBmdWxsLCBhYm9ydGVkLlxuIik7CiAgICBleGl0KDEpOwogIH0KICBzdHJjcHkocC0+bmFtZSwgYnVmKTsKICBwLT5jb3VudCA9IDE7CiAgcmV0dXJuIHA7Cn0KCnZvaWQgaW5zZXJ0d29yZChzdHJ1Y3Qgd29yZCAqKnJvb3QsIGNoYXIgYnVmW05dKSB7CiAgc3RydWN0IHdvcmQgKnA7CiAgcCA9IGNyZWF0ZV93b3JkKGJ1Zik7CiAgcC0+bmV4dCA9ICpyb290OwogICpyb290ID0gcDsKfQoKCnZvaWQgYWRkd29yZChzdHJ1Y3Qgd29yZCAqKnJvb3QsIGNoYXIgYnVmW05dKSB7CiAgaW50IGM7CiAgaWYgKCpyb290ID09IDApIHsKICAgIGluc2VydHdvcmQocm9vdCwgYnVmKTsKICB9IGVsc2UgewogICAgYyA9IHN0cmNtcCgoKnJvb3QpLT5uYW1lLCBidWYpOwogICAgaWYgKGMgPT0gMCkgewogICAgICAoKnJvb3QpLT5jb3VudCsrOwogICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYgKGMgPiAwKSB7CiAgICAgIGluc2VydHdvcmQocm9vdCwgYnVmKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZHdvcmQoJigoKnJvb3QpLT5uZXh0KSwgYnVmKTsKICAgIH0KICB9Cn0KCnZvaWQgZHVtcChzdHJ1Y3Qgd29yZCAqcCkgewogIGlmIChwID09IDApCiAgICByZXR1cm47CiAgcHJpbnRmKCIlcyglZClcbiIsIHAtPm5hbWUsIHAtPmNvdW50KTsKICBkdW1wKHAtPm5leHQpOwp9CgppbnQgbWFpbigpIHsKICBjaGFyIGJ1ZltOXTsKICBGSUxFICpmcDsKCiAgZnAgPSBmb3BlbigiYW5uZV9zaG9ydC50eHQiLCJyIik7CiAgaWYoZnAgPT0gTlVMTCl7CiAgICBwcmludGYoIkZpbGUgcmVhZCBlcnJvciFcbiIpOwogICAgZXhpdCgxKTsKICB9CgogIGludCBuOwogIHN0cnVjdCB3b3JkICpyb290OwogIHJvb3QgPSAwOwoKICBmb3IgKDs7KSB7CiAgICBuID0gcmVhZF93b3JkKGZwLCBidWYpOwogICAgaWYgKG4gPT0gMCkKICAgICAgYnJlYWs7CiAgICBhZGR3b3JkKCZyb290LCBidWYpOwogIH0KICBkdW1wKHJvb3QpOwogIGZjbG9zZShmcCk7CiAgcmV0dXJuIDA7Cn0KLyogZW5kICovCg==