0

私がやろうとしているのは、ハフマン アルゴリズムです。プログラムの仕様の 1 つは、ユーザーが対応する頻度の文字を含む .txt ファイルを作成することです。つまり、文字のリストのようなもので、それぞれの横にその文字の重みがあります。以下は、その .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または同様の関数を使用して文字列を分割することだけです。これで、記号を にコピーし、atoi*symbol使用して確率を an に変換し、それを に書き込むことができます。intprob

編集:strtok 「H5」はおそらくondで解析可能ではないため、ファイルの構造について考える必要があることを言及するのを忘れましたがstrtok、最初の文字が常に記号であり、後はカウントのみです。

編集 #2: fscanfも試してみてください (strtok形式を知っている場合よりもはるかに簡単です)。

于 2012-04-17T05:46:05.563 に答える
0

ツリーは必要ありません。必要なのは構造体の配列だけです。彼は文字の出現を数えるべきであり、26 +/- (他の国では) 文字になる可能性があります (数字が「必要ない」と仮定します。したがって、構造体のアイデアはグーグですが、long の配列または提案された構造体の配列。

とにかく、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 に答える