Другие языки программирования и технологии

Помогите решить написать программу в СИ пожалуйста

Составить словарь. Дан текстовый файл. Составить словарь из 20 наиболее часто встречающихся в этом тексте слов. Слова записать в новый файл в алфавитном порядке.
Тупая и неэффективная реализация в лоб, по уму, надо реализовывать используя структуры типа hash-table или map:

#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define D " ,.?;:\n" // добавить разделителей слов по вкусу

typedef struct { char *w; int c; } wc_t;

int cc(wc_t *t1, wc_t *t2) { return t2->c - t1->c; }
int cw(wc_t *t1, wc_t *t2) { return strcmp(t2->w, t1->w); }

main() {
    FILE *in, *out;
    long int s;
    char *b, *w;
    wc_t *d = (wc_t *)malloc(0);
    int dc = 0, c;
    in = fopen("in.txt", "r");
    fseek(in, 0, SEEK_END);
    s = ftell(in);
    fseek(in, 0, SEEK_SET);
    b = (char *)malloc(s);
    s = fread(b, 1, s, in);
    fclose(in);
    b[ s] = '\0';
    w = strtok(b, D);
    while (w != NULL) {
        for (c = 0; c < dc; ++c) {
            if (strcmp(d[c].w, w) == 0) {
                ++d[c].c;
                break;
            }
        }
        if (c == dc) {
            ++dc;
            d = (wc_t *)realloc(d, dc * sizeof(d[0]));
            d[c].w = w;
            d[c].c = 1;
        }
        w = strtok(NULL, D);
    }
    if (dc > 20) {
        qsort(d, dc, sizeof(d[0]), (int (*)(const void *, const void *))cc);
        dc = 20;
    }
    qsort(d, dc, sizeof(d[0]), (int (*)(const void *, const void *))cw);
    out = fopen("out.txt", "w");
    for (c = 0; c < dc; ++c) fprintf(out,"%s\n", d[c].w);
    fclose(out);
    free(d);
    free(b);
}

!!! Без проверок корректности работы с файлами и памятью !!!

ЗЫ:
> но я не сделаю, если кто может написать программный код
Программный код есть. Но его надо будет допилить и еще и объяснить преподавателю. Вы это сможете?
ВП
Владислав Протопопов
72 958
Лучший ответ
прошу уточнить С или С++, потому что некоторые пишут Си, а на самом деле С++
тогда создаете 2 массива динамических, один строковый, второй числовой, и затем, считывая слово, определяете, если оно есть в массиве, то увеличиваете значение в другом массиве с этим же индексом, а потом сортируете, к сожалению с реализацией дин. массива я сейчас помочь вам не смогу, т. к я юзаю с++ а там вектора