#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 addword(struct word **root, char buf[N]) {
if (*root == 0) {
struct word *p;
p = create_word(buf);
p->next = *root;
*root = p;
return;
} else {
if (strcmp((*root
)->name
, buf
) == 0) { (*root)->count++;
return;
} 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+bmFtZSwgYnVmKTsKICBwLT5jb3VudCA9IDE7CiAgcmV0dXJuIHA7Cn0KCgp2b2lkIGFkZHdvcmQoc3RydWN0IHdvcmQgKipyb290LCBjaGFyIGJ1ZltOXSkgewogIGlmICgqcm9vdCA9PSAwKSB7CiAgICBzdHJ1Y3Qgd29yZCAqcDsKICAgIHAgPSBjcmVhdGVfd29yZChidWYpOwogICAgcC0+bmV4dCA9ICpyb290OwogICAgKnJvb3QgPSBwOwogICAgcmV0dXJuOwogIH0gZWxzZSB7CiAgICBpZiAoc3RyY21wKCgqcm9vdCktPm5hbWUsIGJ1ZikgPT0gMCkgewogICAgICAoKnJvb3QpLT5jb3VudCsrOwogICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICBhZGR3b3JkKCYoKCpyb290KS0+bmV4dCksIGJ1Zik7CiAgICB9CiAgfQp9Cgp2b2lkIGR1bXAoc3RydWN0IHdvcmQgKnApIHsKICBpZiAocCA9PSAwKQogICAgcmV0dXJuOwogIHByaW50ZigiJXMoJWQpXG4iLCBwLT5uYW1lLCBwLT5jb3VudCk7CiAgZHVtcChwLT5uZXh0KTsKfQoKaW50IG1haW4oKSB7CiAgY2hhciBidWZbTl07CiAgRklMRSAqZnA7CgogIGZwID0gZm9wZW4oImFubmVfc2hvcnQudHh0IiwiciIpOwogIGlmKGZwID09IE5VTEwpewogICAgcHJpbnRmKCJGaWxlIHJlYWQgZXJyb3IhXG4iKTsKICAgIGV4aXQoMSk7CiAgfQoKICBpbnQgbjsKICBzdHJ1Y3Qgd29yZCAqcm9vdDsKICByb290ID0gMDsKCiAgZm9yICg7OykgewogICAgbiA9IHJlYWRfd29yZChmcCwgYnVmKTsKICAgIGlmIChuID09IDApCiAgICAgIGJyZWFrOwogICAgYWRkd29yZCgmcm9vdCwgYnVmKTsKICB9CiAgZHVtcChyb290KTsKICBmY2xvc2UoZnApOwogIHJldHVybiAwOwp9Ci8qIGVuZCAqLwo=