我想在objective-c中创建一个带结构的二叉树,下面是我正在做的事情:
struct mytree{
int value;
struct mytree *parent;
struct mytree *left;
struct mytree *right;
};
- (void)insertmytree: (struct mytree *)root value:(int)value{
struct mytree *temp;
if (root == nil) {
temp->value = value;
temp->left = nil;
temp->right = nil;
root = temp;
return;
}
if (value < root->value) {
return [self insertmytree:root->left value:value];
}else{
return [self insertmytree:root->right value:value];
}
}
生成树:
struct mytree t1;
t1.value = 10;
t1.parent = nil;
t1.left = nil;
t1.right = nil;
[self insertmytree:&t1 value:8];
[self insertmytree:&t1 value:3];
[self insertmytree:&t1 value:87];
[self insertmytree:&t1 value:45];
[self insertmytree:&t1 value:2];
[self insertmytree:&t1 value:4];
[self insertmytree:&t1 value:9];
它不起作用,请指出我正确的方向
答案 0 :(得分:0)
我没有测试过,但这应该可行。
struct mytree{
int value;
struct mytree *parent;
struct mytree *left;
struct mytree *right;
};
- (void)insertmytree: (struct mytree *)root value:(int)value{
struct mytree *temp = malloc(sizeof(struct mytree));
if (root == nil) {
temp->value = value;
temp->left = nil;
temp->right = nil;
root = temp;
return;
}
if (value < root->value) {
return [self insertmytree:root->left value:value];
}else{
return [self insertmytree:root->right value:value];
}
}
然后,当您从树中删除项目时,需要一些mekanism来清理动态分配的内存。
答案 1 :(得分:0)
在(Objective-)C(++)中,您必须显式分配您在堆上动态创建的任何对象/结构,只需声明一个类型为的变量指向对象/结构的指针不会分配对象/结构并将其引用存储在变量中。
例如:
NSMutableArray *myArray;
创建一个变量myArray
,其类型为指向可变数组的指针,NSMutableArray *
。它不会创建数组。声明:
myArray = [NSMutableArray new];
分配一个新的可变数组并在myArray
中存储对它的引用。
对于堆分配的C结构,您需要使用malloc()
,它将对象/结构的大小作为参数,使用sizeof
获得。
为你的例子做:
struct mytree *temp;
创建一个变量temp
,它可以保存对struct mytree
的引用,以及语句:
temp = (struct mytree *)malloc( sizeof(struct mytree) );
在堆上创建一个(未初始化的)struct mytree
并在temp
中存储对它的引用。
当您不再需要时,您还需要释放动态分配的内存。 E.g:
free(temp);
将释放temp
引用的对象/结构,该对象/结构必须是使用malloc
(或malloc
系列中的其他函数)创建的对象/结构。注意:此语句不更改temp
中的值,因此在此调用之后temp
中的值是对已释放内存的引用,如果temp
仍在使用您可能希望为其分配NULL
以避免意外访问已释放的内存。
HTH