我要做的是霍夫曼算法。该程序的一个规范是用户将创建一个.txt文件,其中包含具有相应频率的字符。所以它就像一个字符列表,每个字符旁边都是该字符的重量。下面是that.txt文件的一个例子:
H5
J4
K6
S9
L2
N1
我设法做的是阅读并显示.txt文件。而且我很难将它实现到一个链表中。我已经尝试过阅读fread()fwrite()和所有其他函数,但我真的无法得到它的要点。非常感谢任何形式的帮助。 :d
答案 0 :(得分:0)
尽管您需要一棵树,但我认为您正在使用struct
进行存储,例如
struct list {
char *symbol;
int prob;
struct list *next;
};
因此,如果您已设法阅读文件,那么您将拥有字符串," H5"," J4"等等。您所要做的就是将字符串拆分为例如strtok或类似函数。现在,您可以将符号复制到*symbol
并将概率转换为atoi,然后将其转换为int
。
编辑:忘记提及,您应该考虑一下文件的结构,因为" H5"如果第一个字符始终是符号,之后只是计数,那么prob
可能不是那么好的可解析的另一方面你可能根本不需要strtok
。
修改#2:还要尝试fscanf(如果您知道格式,则比strtok
容易得多。)
答案 1 :(得分:0)
您不需要树,您只需要一系列结构。他应该计算出characers的出现次数,并且可以有26 +/-(对于其他国家)字符(假设数字不是“想要的”。 所以结构的想法是goog。但人们可以想象一个长数组或一个结构数组。
无论如何,如果我们定义array [0] = frequencies_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;
}