我正在尝试做的是霍夫曼算法。该程序的规格之一是用户将创建一个 .txt 文件,其中包含具有相应频率的字符。所以它就像一个字符列表,每个旁边都是该字符的权重。下面将是 that.txt 文件的示例:
H5
J4
K6
S9
L2
N1
我设法做的是读取和显示 .txt 文件。而且我很难将它实现到链接列表中。我已经尝试阅读 fread() fwrite() 和所有其他函数,但我真的无法理解它的要点。非常感谢任何形式的帮助。:D
我正在尝试做的是霍夫曼算法。该程序的规格之一是用户将创建一个 .txt 文件,其中包含具有相应频率的字符。所以它就像一个字符列表,每个旁边都是该字符的权重。下面将是 that.txt 文件的示例:
H5
J4
K6
S9
L2
N1
我设法做的是读取和显示 .txt 文件。而且我很难将它实现到链接列表中。我已经尝试阅读 fread() fwrite() 和所有其他函数,但我真的无法理解它的要点。非常感谢任何形式的帮助。:D
尽管您将需要一棵树,但我假设您正在使用struct
存储,例如
struct list {
char *symbol;
int prob;
struct list *next;
};
因此,如果您已设法读取文件,那么您将拥有字符串、“H5”、“J4”等。您所要做的就是拆分字符串,例如使用strtok或类似函数。现在您可以将符号复制到*symbol
并将atoi的概率转换为 an int
,从而将其写入prob
.
编辑:忘了提,你应该考虑文件的结构,因为“H5”可能不是很好的解析,strtok
另一方面strtok
,如果第一个字符总是符号和之后只是计数。
编辑#2:也试试fscanf(比strtok
你知道格式容易得多)。
你不需要一棵树,你只需要一个结构数组。他应该计算字符的出现次数,并且只能有 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;
}