- ベストアンサー
単語の出現回数を数え、出現回数順に表示するには?
標準入力または入力ファイルから単語の出現回数を調べるプログラムの一部です。ENTRY *add_entry(ENTRY *new)関数で以前に出てきた単語か(正確には以前に同一内容の行があったかを)判断し、既出ならばvoid do_one(FILE *fp)関数内部でp->count++として出現回数に加算しています。void do_one(FILE *fp)関数の最後の方のprintfで単語とその出現回数を表示します。これだとappleという単語が2回出てくれば、 apple:1 apple:2 と表示されます。この場合は apple:2 だけ表示させ、さらに、出現回数の多い順に単語を並べて表示させたいんです。どういう風にすればいいでしょうか? typedef struct entry_t { char *str; struct entry_t *next; int count; /* 単語の出現回数 */ } ENTRY; int main(int argc, char **argv) { FILE *fp; char *s; init_hash(); --argc; ++argv; if (argc == 0) do_one(stdin); else { while (argc--) { if ((fp = fopen(*argv, "r")) == NULL) cant(*argv); /* no return */ do_one(fp); fclose(fp); argv++; } } free_all_entries(); return (0); } void do_one(FILE *fp) { ENTRY *p; char buf[MAX_SIZE]; int i; while (fgets(buf, MAX_SIZE, fp) != NULL) { if ((p = malloc(sizeof(ENTRY))) == NULL) error("can't alloc memory"); /* no return */ if ((p->str = strdup(buf)) == NULL) error("can't alloc memory"); /* no return */ if (add_entry(p) != p) { p->count++; /* 登録済みなので単語の出現回数を1増やす */ free(p->str); /* すでに登録されているので開放 */ free(p); } else /* 新しく単語を登録する場合 */ p->count =1; /* 単語の出現回数を1にする */ printf("%s : %d\n", p->str, p->count); } } void init_hash(void) { int i; for (i = 0; i < HASHSIZE; i++) table[i] = NULL; } ENTRY *add_entry(ENTRY *new) { ENTRY *p; int h; h = hash(new->str); /* 追加する単語のハッシュ値を求める */ for (p = table[h]; p != NULL; p = p->next) if (strcmp(p->str, new->str) == 0) { /* 追加済みの単語ならば */ return (p); /* そのデータのポインタを返す */ } new->next = table[h]; table[h] = new; /* 単語を追加する */ return (new); }
- みんなの回答 (2)
- 専門家の回答
お礼
具体的な説明ありがとうございました。じっくり考えてやってみます。