アルゴリズムに必要なすべての操作を実行するアクセサー関数/メソッド (実装言語に応じて) を使用して、両方を含むコンテナーを作成します。
IE: コンテナから削除: バイナリとハッシュから削除します。
コンテナーに追加: バイナリーとハッシュに追加します。
編集: ああ、割り当て - 楽しい! :)
私はこれを行います:まだコンテナを実装しています。ただし、btree/hash の標準ライブラリを使用する代わりに、次のように実装します。BTree ノードとデータ要素が存在する Hashtable ノードへのポインターを持つデータ メンバーに配置できる型を作成します。
データ要素を削除するには、データ要素へのポインターを指定すると、btree (ノード ポインターから親に移動、子 (左または右) を削除、ツリーを再構築) およびハッシュ テーブル (ハッシュ リストから削除) に対して削除アルゴリズムを実行できます。 )。値を追加するときは、btree とハッシュに対して追加アルゴリズムを実行しますが、戻る前に必ずデータ内のノード ポインターを更新してください。
いくつかの疑似コード (C を使用しますが、使用している言語はわかりません): typedef struct { BTreeNode* btree HashNode* hash } ContianerNode;
コンテナにデータを入れるには:
typedef struct
{
ContainerNode node;
void* data; /* whatever the data is */
} Data;
BTreeNode には次のようなものがあります。
typedef struct _BTreeNode
{
struct _BTreeNode* parent;
struct _BTreeNode* left;
struct _BTreeNode* right;
} BTreeNode;
HashNode には次のようなものがあります。
typedef struct _HashNode
{
struct _HashNode* next;
} HashNode;
/* ala singly linked list */
BTree は BTreeNode へのポインタになり、hastable は HashNodes へのポインタの配列になります。このような:
typedef struct
{
BTreeNode* btree;
HashNode* hashtable[HASHTABLESIZE];
} Container;
void delete(Container* c, ContainerNode* n)
{
delete_btree_node(n->btree);
delete_hashnode(n->hash);
}
ContainerNode* add(Container* c, void* data)
{
ContainerNode* n = malloc(sizeof(ContainerNode));
n->btree = add_to_btree(n);
n->hash = add_to_hash(n);
}
私はあなたにそれらの他の機能を完了させます(あなたのためにすべての割り当てを行うことはできません;))