Как внедрить текстовый файл в связанный список?

То, что я пытаюсь сделать, это алгоритм Хаффмана. Одна из спецификаций программы заключается в том, что пользователь создаст файл.txt, содержащий символы с соответствующими частотами. Таким образом, это будет похоже на список персонажей, и рядом с каждым будет вес этого персонажа. Ниже приведен пример этого файла.txt:

H5
J4
K6
S9
L2
N1

Что мне удалось сделать, это прочитать и отобразить файл.txt. И мне трудно реализовать его в связанном списке. Я попытался прочитать fread() fwrite() и все эти другие функции, но я действительно не могу понять суть этого. Любая помощь очень ценится.:D

2 ответа

Несмотря на то, что вам понадобится дерево, я предполагаю, что вы используете struct для хранения, что-то вроде

struct list {
    char *symbol;
    int prob;
    struct list *next;
};

Так что, если вам удалось прочитать ваш файл, то у вас есть строки, "H5", "J4" и так далее. Все, что вам нужно сделать, это разделить строку, например, с помощью strtok или аналогичной функции. Теперь вы можете скопировать символ в *symbol и преобразовать вероятность с Atoi в int и, таким образом, писать это prob,

Изменить: Забыл упомянуть, что вы должны думать о структуре вашего файла, потому что "H5", вероятно, не так хорошо разбирается с strtok С другой стороны, может быть, вам не нужно strtok вообще, если первый символ всегда является символом, а после - только счетчиком.

Редактирование #2: Также попробуйте fscanf (намного проще, чем strtok если вы знаете формат).

Вам не нужно дерево, массив структур - это все, что вам нужно. Он должен посчитать вхождения символов-символов и только 26 +/- (для других стран) символов (при условии, что числа не являются "разыскиваемыми". Так что идея со структурой - goog. Но можно представить либо массив длинных, либо Массив структур, как предлагается.

В любом случае, если мы определим array[0] = sizes_of_As, мы сможем очень легко вычислить вхождения символов.

char *asUpper = toupper(ch);
frequency_Array [char - 'A'] += 1;

и написание будет просто цикл

up_to = 'Z' - 'A';
for (i = 0, ch = 'A'; i < up_to; i++, ch++){
   fprintf(file, "%d%c", i, ch)

или т.п

Если вы хотите прочитать файл, и этот файл является строгим, то достаточно простого цикла, я предполагаю, что у нас просто есть 26 букв алфавита

 long counter; char ch;
    for i = 0; i < up_to; i++){
          int how_many = fscanf(file_to_use, "%c%d\n", &counter, &ch);
          assert(ch >= 'A' && ch <= 'Z');
          frequenceArray[ch - 'A'] = counter;
     }
Другие вопросы по тегам