2017-12-01 18 views
0

私はモールスエンコーダ - デコーダを作成しようとしましたが、バイナリ検索ツリー(配列ではない)でそれを行う必要があります。次の部分は、以前はテキストファイルから作成した文字配列をとり、それに基づいて検索ツリーを作成します。文字列からバイナリ検索ツリーを作成するには?

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; 
} 
+0

のようなものであるとして、あなただけのrootに渡したいことがある;'から来るの? * gccの場合は '-Wall -Wextra'、VS(' cl.exe')の場合はclangや '/ Wall'(または'/W4')の '-Weverything'のように*警告を有効にしてコンパイルしていますか? –

+0

ああ、申し訳ありませんが、 'uj'は 'new'とされています。私はそれを修正しました。 – Heves

答えて

0

あなたは値によってbuildにルートノードを渡しているので、それの値への変更は、呼び出し元の関数に反映されません。あなたが推測したように、それをBTree **にするルートへのポインタを渡す必要があります。あなたは間接参照rootにあなたが持っているルートノードにアクセスしたいとき

build(&bin_root, btree_base, 238); 

はその後build内部でこのような*でそれを前に置くことにより、最初:

*root=add(*root, b, k, size); 

addもむしろ、そのように働いてから利益を得ることができます更新されたノードを返します。 build以来どのすでにBTree **は `uj->手紙= CHんこの

add(root, b, k, size); 
関連する問題