2

一般的なBSTの作成を検討しています。COTSがないという空想はありませんが、ボイドのタイプを追跡するための最良の方法を決定しようとしています*。ノードのインターフェースは次のとおりです。

typedef struct
{
   void *data;
   struct TreeNode *left;
   struct TreeNode *right;  
} TreeNode;

ただし、追加/削除を作成するときは、比較を行う必要があるため、「データ」が指しているデータの種類を追跡する必要があります。

基本的な考え方は、列挙型Node_Typeと、2つのTreeNodeと列挙型を3番目の引数として受け取る関数compareTreeNodesを持つことです。これにより、関数はvoid*のキャスト先を決定できます。

他の/より良い考えはありますか?

4

2 に答える 2

4

ただし、追加/削除を作成するときは、比較を行う必要があるため、「データ」が指しているデータの種類を追跡する必要があります。

qsort()この問題をどのように解決するかを見てください。また、任意のデータ型で動作する必要があります。基本的に、関数ポインタを介してユーザーに比較を委任します。

于 2010-10-14T13:38:32.900 に答える
3

1つのBSTには1つのタイプのデータしか含まれないと思います。structその場合、ルートノードへのポインターと比較関数へのポインターを含むカプセル化を作成します。BSTのユーザーは、初期化時に適切な機能を提供する必要があります。

typedef struct {
    TreeNode *root;
    int (*compar)(const void *, const void *);
} Tree;

ところで、あなたの最初の行はおそらくですtypedef struct TreeNode {。typdefされた匿名がありますが、struct内部に存在しないタグ付き構造体を参照しています。これらの2つのバージョンは機能します。

typedef struct TreeNode {
    void *data;
    struct TreeNode *left, *right;
} TreeNode;

typedef struct TreeNode TreeNode;
struct TreeNode {
    void *data;
    TreeNode *left, *right;
};

自己参照を匿名にすることはできませんstructs

于 2010-10-14T13:42:30.100 に答える