次のような構造を再帰的に解放する関数を作成する必要があります。
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
しますが、それはあなた次第です。prev
nextLink
next
variationLink
variation
- としてではなく、内部形式を使用して移動を保存する必要があります
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ですが、カスタムメソッドを使用しています。