2012-06-29 4 views
1

Я создал древовидную структуру с помощью c и использовал ее для хранения некоторых ходов шахматной игры. моей структураКак выпустить древовидную структуру в проекте xcode?

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

я создать узел с помощью malloc.When игры изменяется или выгружена я хочу, чтобы освободить дерево, есть ли способ сделать это в dalloc или я должен сделать функцию, чтобы дойти до каждого узла и бесплатно?

+0

Как насчет того, чтобы использовать free() для их выпуска? Вы можете сделать это в своей функции dealloc своего родителя или где-то еще ... –

+0

Да, я упомянул об этом, но для этого мне нужно будет перейти от узла к узлу – amar

+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, но это до вас, на самом деле.
  • Вам необходимо сохранить ход, используя внутренний формат, а не как NSString. Строки должны генерироваться только во время отображения (в методе рисования вида). Это позволяет вам фактически использовать данные перемещения, вместо того, чтобы снова обрабатывать строку (очень дорого) и выполнять преобразование строк только во время отображения, позволяет вам изменять способ создания строки перемещения на основе пользовательских настроек (короткая алгебраическая нотация, длинная алгебраическая обозначать, координировать обозначение, используя шрифты с характерными символами, а не буквы и т. д.).

Edit после вопроса из 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 будет удерживаться с использованием такого дерева (если ссылки не показаны на узле, то они равны NULL):

enter image description here

Я использую этот подход в шахматной программе я развиваю, и это очень хорошо работает. Повторить; Я отделяю данные (этот узел) от представления (строка, содержащая текст перемещения, отображаемый в пользовательском интерфейсе). Сгенерированные строки перемещения должны храниться совсем другим образом; возможно, Core Text, но я использую собственный метод.

+0

[n-> comment release]; [n-> move release]; они нужны? becoz я никогда не называл alloc на комментарий и переехал, я только что назвал malloc (sizeof (struct node))? – amar

+0

И благодарность за бесплатную функцию – amar

+0

Для того, чтобы объекты 'NSString' были инициализированы и сохранены правильно, вы должны использовать что-то вроде' n-> comment = [[NSString alloc] initWithUTF8String: c_string]]; ', поэтому да, они должны будут чтобы избежать утечек памяти. – trojanfoe

2

Внедрение деструктора для узла.

Использовать free() для основного узла, если все узлы внутри узла являются просто ссылками.

+0

... что приводит к утечке памяти. – trojanfoe

Смежные вопросы