0

我正在尝试做的是霍夫曼算法。该程序的规格之一是用户将创建一个 .txt 文件,其中包含具有相应频率的字符。所以它就像一个字符列表,每个旁边都是该字符的权重。下面将是 that.txt 文件的示例:

H5
J4
K6
S9
L2
N1

我设法做的是读取和显示 .txt 文件。而且我很难将它实现到链接列表中。我已经尝试阅读 fread() fwrite() 和所有其他函数,但我真的无法理解它的要点。非常感谢任何形式的帮助。:D

4

2 回答 2

0

尽管您将需要一棵树,但我假设您正在使用struct存储,例如

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

因此,如果您已设法读取文件,那么您将拥有字符串、“H5”、“J4”等。您所要做的就是拆分字符串,例如使用strtok或类似函数。现在您可以将符号复制到*symbol并将atoi的概率转换为 an int,从而将其写入prob.

编辑:忘了提,你应该考虑文件的结构,因为“H5”可能不是很好的解析,strtok另一方面strtok,如果第一个字符总是符号和之后只是计数。

编辑#2:也试试fscanf(比strtok你知道格式容易得多)。

于 2012-04-17T05:46:05.563 回答
0

你不需要一棵树,你只需要一个结构数组。他应该计算字符的出现次数,并且只能有 26 个 +/-(对于其他国家/地区)字符(假设数字不是“想要的”。所以结构的想法是 goog。但人们可以想象一个长数组或建议的结构数组。

无论如何,如果我们定义 array[0] =frequency_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;
     }
于 2012-04-17T05:58:32.377 回答