我使用c制作了一个树形结构并用它来存储国际象棋游戏的一些动作。 我的结构是
struct node{
NSString *comment;
NSString *move;
struct node *variationLink;
struct node *nextLink;
struct node *goBack;
};
我使用malloc创建节点。当游戏被更改或卸载时我想释放树是否有任何方法可以在dalloc中执行它或者我必须创建一个函数来到达每个节点并释放它?
答案 0 :(得分:2)
为节点实现析构函数。
如果节点内的所有节点都只是链接,则使用free()
作为主节点。
答案 1 :(得分: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
重命名为prev
,将nextLink
重命名为next
,将variationLink
重命名为variation
,但这取决于您。< / LI>
NSString
。只应在显示期间生成字符串(在视图的绘制方法中)。这允许您实际使用移动数据而不必再次解析字符串(非常昂贵)并且仅在显示期间执行字符串转换允许您根据用户首选项更改移动字符串的方式(短代数表示法,长代数)符号,坐标符号,使用片段字符而不是字母等。)。在OP问题后进行编辑:为了让您的树能够存储多个变体,您需要创建双重链接的变体列表。因此,该节点将成为两个双向链表的一部分。用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将使用这样的树来保存(如果节点上没有显示链接,那么它们是{{ 1}}):
我正在开发的国际象棋程序中使用这种方法,并且它运行良好。重新迭代;我将数据(此节点)与演示文稿(包含UI中显示的移动文本的字符串)分开。生成的移动字符串应该以不同的方式保存;也许是Core Text,但我使用的是自定义方法。