大学の課題で語頭符号の木を生成するプログラムを完成せよというものが出ました。
穴埋めなのですが???の部分がよくわかりません。木は左側を長くするものです。
手描きで木をかけなどと言われればできるのですが、プログラミングに慣れておらず
この部分にとても困っています。特にvisitの使い方、i番目の符号語の割り当てにおいて…の部分(これは国語力の問題?)がよくわかっていません。
コードでなく考え方のヒントをくださればと思っております。
C
1 2typedef struct node_t { 3 struct node_t *up, *left, *right; //親と左右の子 4 int visit; //訪問済みかどうかのフラグ 5 int symbol; //記号の番号 6 int leaf; //葉かどうかのフラグ 7} *node; //node_tのポインタをnodeと名付ける 8 9struct node_t pool[MAX_NODES] = {{0}}; 10int n_nodes = 1; 11char *code[CODE_SIZE] = {0}; 12char buf[BUFFER_SIZE]; 13 14void make_tree(int asize, int *l)//i番目の符号長はl[i]、番号の小さいものほど符号長も短いとする 15{ 16 node t; //符号の木 17 for(int i = 0; i < asize; i++) { 18 t = pool; 19 for(int j = 0; j < l[i]; j++) { 20 21 if(t->left == 0) { 22 t->left = pool + n_nodes++; 23 t->left->up = t; 24 t->right = pool + n_nodes++; 25 t->right->up = t; 26 } 27 28 //i番目の符号語の割当において左の子を訪問していない場合 29 if(t->left->visit != asize + i) { 30 //??? 31 } 32 //i番目の符号語の割当において右の子を訪問していない場合 33 else if(t->right->visit != asize + i) { 34 //??? 35 } 36 //左右の子に訪問していた場合 37 else { 38 //??? 39 } 40 } 41 } 42}
「左の子を訪問してない場合、~という処理をしたいです」ぐらいまで具体的な内容を書いたほうがいいように思います
あなたの回答
tips
プレビュー