私はモールスエンコーダ - デコーダを作成しようとしましたが、バイナリ検索ツリー(配列ではない)でそれを行う必要があります。次の部分は、以前はテキストファイルから作成した文字配列をとり、それに基づいて検索ツリーを作成します。文字列からバイナリ検索ツリーを作成するには?
btree_base文字配列のデータは、 "(文字)(モールス符号)|(文字)(モールス符号)|"など(例えば、e。| t - | z - .. | ...)。
注:文字列が最初から最後までそれを読むことによって、バランスの取れた探索木は、私が知っている
バイナリツリーの作成がunsuccesfulある、作成されるような方法でデータが含まれ、私がコードを実行すると、btree_print関数はコンソール上に何も表示しないので、NULLポインターが渡されるためです。
私の質問は、それがどうして問題解決になるのでしょうか?私はポインタを混乱させましたか、またはルートポインタを渡すときに二重間接を使用する必要がありますか?私は実際にポインタを理解していないので、それらを避けようとしました。
typedef struct BinTree{
char letter;
char code[6];
struct BinTree *left, *right;
} BTree;
BTree* add(BTree* root, char ch, char* code, int length){
int i;
char a;
if (root == NULL) {
BTree *new = (BTree*) malloc(sizeof(BTree));
new->left = new->right = NULL;
new->letter = ch;
for(i=0; i<length; i++) new->code[i] = code[i];
new->code[length] = '\0';
return new;
}
a=root->letter;
if (ch < a) root->left = add(root->left, ch, code, length);
else if (ch > a) root->right = add(root->right, ch, code, length);
return root;
}
void build(BTree* root, char* c, int length){
int i, size=-1;
char b, k[6];
for(i=0; i<length; i++){
if(size==-1) b=c[i];
if(c[i]==' ') size=0;
if(size!=-1 && c[i]!='|'){
k[size]=c[i];
size++;
}
if(c[i]=='|'){
k[size]='\0';
root=add(root, b, k, size);
size=-1;
}
}
}
void btree_print(BTree* root){
if(root == NULL) return;
printf("%c %s\n",root->letter,root->code);
btree_print(root->left);
btree_print(root->right);
}
void btree_del(BTree* root){
if(root==NULL) return;
btree_del(root->left);
btree_del(root->right);
free(gyoker);
}
int main(){
char btree_base[238];
BTree* bin_root = NULL;
build(bin_root, btree_base, 238);
btree_print(bin_root);
btree_del(bin_root);
return 0;
}
のようなものであるとして、あなただけの
root
に渡したいことがある;'から来るの? * gccの場合は '-Wall -Wextra'、VS(' cl.exe')の場合はclangや '/ Wall'(または'/W4')の '-Weverything'のように*警告を有効にしてコンパイルしていますか? –ああ、申し訳ありませんが、 'uj'は 'new'とされています。私はそれを修正しました。 – Heves