1

二分探索木に文字列を挿入する必要がありますが、挿入関数を実行するたびに、適切なノードだけでなくすべてのノードが更新されます。二分探索ツリーに配置された各単語には、正確な量のメモリが割り当てられている必要があります (NULL ポインターの場合は +1)。

使用されている構造体は次のとおりです。

typedef struct node_t{
   char *word;
   struct node_t *left, *right;
} node_t;

これが私が言葉を渡す方法です:

for(i=0; i< original_words -1; i++)
{
    fscanf(ifp, "%s", y);
    head = insert(head, y);
}

そして、ここに私の挿入機能があります:

node_t *insert(struct node_t *head, char *word)
{

if(strcmp(head->word, word) > 0)
{

    if(head->left == NULL)
    {
        head->left = create_node(word);
    }
    else
    {
        head->left = insert(head->left, word);
    }
}

else
{
    if(head->right == NULL)
    {
        head->right = create_node(word);
    }
    else
    {
        head->right = insert(head->right, word);
    }
}

return head;

}

編集:入力ファイルの例を次に示します。

4
-------
bravo
-------
alpha
-------
gamma
-------
delta
4

1 に答える 1

1

あなたの答え (関数) は、最初の呼び出しで既に定義されていることをinsert前提としています。次の行で開始する必要があります。head

if (head == null) return create_node(word);

これにより、コード内のヌル行が不要になります。これが問題かどうかはわかりませんが問題の 1 つです。

おそらくもっと重要です:どのようにcreate_nodeセットアップしwordますか?次のような場合:

 new_node->word = word

次に、ファイルから引き出された単語へのポインターのコレクションを作成するだけです。ファイルから単語を読み取るたびに、その単語が同じメモリ部分に読み込まれる可能性が非常に高いため、メモリ内の同じ場所へのポインターのツリーを収集するだけです。次のようになります。

 new_node->word = malloc(strlen(word)+1);
 if (new_note->word == null) {FAIL MEMORY LOSS}
 strcpy(new_node->word, word);
于 2013-04-10T20:18:00.503 に答える