Как внедрить текстовый файл в связанный список?
То, что я пытаюсь сделать, это алгоритм Хаффмана. Одна из спецификаций программы заключается в том, что пользователь создаст файл.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;
}