1

私は c を使用してツリー構造を作成し、チェス ゲームのいくつかの動きを格納するために使用しました。私の構造は

struct node{
        NSString *comment;
        NSString *move;
        struct node *variationLink;
        struct node *nextLink;
        struct node *goBack;
    };

ゲームが変更またはアンロードされたときにツリーを解放したい

4

2 に答える 2

2

ノードのデストラクタを実装します。

free()ノード内のすべてのノードが単なるリンクである場合、メイン ノードに使用します。

于 2012-06-29T07:45:23.110 に答える
2

次のような構造を再帰的に解放する関数を作成する必要があります。

void free_nodes(struct node *n)
{
    if (n != NULL)
    {
        free_nodes(n->nextLink);
        free_nodes(n->variationLink);
        [n->comment release];
        [n->move release];
        free(n);
    }
}

dealloc次に、メソッド内からそれを呼び出します。

- (void)dealloc
{
    free_nodes(_root_node);
    [super dealloc];
}

他のコメント:

  • バリエーションのメインラインに戻るリンクが必要になる場合があります。これはgoBackポインタと同等ですが、バリエーション用です。現時点では、ツリーを完全に横断する方法がないため、これにより、任意のノードのメインラインに戻ることができます。
  • 、 、に名前を変更goBackしますが、それはあなた次第です。prevnextLinknextvariationLinkvariation
  • としてではなく、内部形式を使用して移動を保存する必要がありますNSString。文字列は、表示中 (ビューの draw メソッド内) にのみ生成する必要があります。これにより、文字列を再度解析する必要がなくなり (非常にコストがかかります)、移動データを実際に使用できるようになり、表示中にのみ文字列変換を行うことで、ユーザー設定 (短い代数表記、長い代数表記) に基づいて移動文字列の生成方法を変更できます。表記、座標表記、文字ではなくピース文字フォントの使用など)。

OPからの質問後に編集:ツリーに複数のバリエーションを保存できるようにするには、バリエーションの二重リンクリストを作成する必要があります。したがって、ノードは、二重にリンクされた 2 つのリストの一部になります。これを C++ で書くと役に立ちますが、C を使用している場合は、C で示します。

typedef struct node
{
    Move move;    // Holds the move (this can be done using a 32-bit unsigned integer).
    struct node *prev;
    struct node *next;
    struct node *variation;
    struct node *mainline;
    NSString *comment;
} Node;

ここで、mainlineリンクは前のバリエーションを指していNULLます。これは、これがメインラインの動きである場合です。

移動 1.e4 e5 (1...Nf6 a4) (1...Nc6 b4) 2.Nc3 は、次のようなツリーを使用して保持されます (リンクがノードに表示されない場合、リンクは次のようになりますNULL)。

ここに画像の説明を入力

私は開発中のチェスプログラムでこのアプローチを使用しており、非常にうまく機能しています。繰り返します。データ (このノード) をプレゼンテーション (UI に表示される移動テキストを含む文字列) から分離します。生成された移動文字列は、まったく別の方法で保持する必要があります。おそらくCore Textですが、カスタムメソッドを使用しています。

于 2012-06-29T08:52:11.370 に答える