0

二分木への要素の挿入について質問したいのですが、テーブルに要素を挿入する必要があります。ただ、二分木が作れないというポインタなどを誤解していたと思います。

挿入関数は、メイン関数を含む別のファイルによって呼び出されるため、すべての要素が挿入されるまで、挿入関数が定期的に呼び出されます。次に、挿入関数はsub_insertを呼び出して、すべての要素を挿入します。二分木を読み込もうとしたところ、空でした。誰かが修正するものを提案できますか?

   typedef struct node * tree_ptr;
   /*typedef char* Key_Type; */

   struct node {
     Key_Type element; // only data is the key itself
     tree_ptr left, right;
     int depth;
   };

   struct table {
     tree_ptr head; // points to the head of the tree


   };
   struct table head,tail;



   struct node* newNode(Key_Type key){
      struct node* node=(struct node*)malloc(sizeof(struct node));
      node->element=key;
      node->left=NULL;
      node->right=NULL;
      return (node);
   }

   tree_ptr sub_insert(Key_Type key, struct node *node, Table table) {
      printf("reading... %s\n", key);

     if(node==NULL)
       return(newNode(key));

     else
     {
       if(key <= node->element){
         printf("inserted");
         node->left = sub_insert(key, node->left, table);
       }else{
         node->right = sub_insert(key, node->right, table);
       } 
         return node;
     }
   }

   Table insert(Key_Type key, Table table) {

        struct node* root=NULL;
        root=sub_insert(key, root, table);

        return table;
   }
4

2 に答える 2

1

Joachimが言ったように、あなたの問題はあなたが常にルートノードとしてNULLを使用しているということです:

    struct node* root=NULL;
    root=sub_insert(key, root, table);

推測していますが、開始ノードとしてtable.headを使用したいようです。

    root=sub_insert(key, table.head, table);

テーブルがポインタであるかどうかはわからないので、ドット表記を使用しました。

いずれの場合も、sub_insert()でトラバースする前に、有効なルートノードが絶対に必要です。そうしないと、すべての新しいノードがメモリにぶら下がってしまいます。

于 2013-02-11T14:47:28.137 に答える
0

insert関数を見てみましょう:

Table insert(Key_Type key, Table table) {
    struct node* root=NULL;
    root=sub_insert(key, root, table);
    return table;
}

ここでは、ルートノードを宣言し、それをへの呼び出しで使用しますsub_inserttable次に、で変更されない不明な変数を返しますsub_insert。これは、作成したノードが失われることを意味します。

于 2013-02-11T13:36:35.507 に答える