如何将文本文件实现到链表中?

时间:2012-04-17 05:34:26

标签: c compression huffman-code

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

H5
J4
K6
S9
L2
N1

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

2 个答案:

答案 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;
     }